TransitionHelper.java revision ce0bd5abebf662db7d8b42468009b227715698ec
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.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 void setEnterTransition(android.app.Fragment fragment, Object transition);
66
67        public void setExitTransition(android.app.Fragment fragment, Object transition);
68
69        public Object getSharedElementEnterTransition(Window window);
70
71        public Object getSharedElementReturnTransition(Window window);
72
73        public Object getSharedElementExitTransition(Window window);
74
75        public Object getSharedElementReenterTransition(Window window);
76
77        public Object getEnterTransition(Window window);
78
79        public Object getReturnTransition(Window window);
80
81        public Object getExitTransition(Window window);
82
83        public Object getReenterTransition(Window window);
84
85        public Object createScene(ViewGroup sceneRoot, Runnable r);
86
87        public Object createAutoTransition();
88
89        public Object createSlide(int slideEdge);
90
91        public Object createScale();
92
93        public Object createFadeTransition(int fadingMode);
94
95        public Object createChangeBounds(boolean reparent);
96
97        public Object createFadeAndShortSlide(int edge);
98
99        public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay);
100
101        public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay);
102
103        public void setChangeBoundsStartDelay(Object changeBounds, String className,
104                int startDelay);
105
106        public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay);
107
108        public Object createTransitionSet(boolean sequential);
109
110        public void addTransition(Object transitionSet, Object transition);
111
112        public void setTransitionListener(Object transition, TransitionListener listener);
113
114        public void runTransition(Object scene, Object transition);
115
116        public void exclude(Object transition, int targetId, boolean exclude);
117
118        public void exclude(Object transition, View targetView, boolean exclude);
119
120        public void excludeChildren(Object transition, int targetId, boolean exclude);
121
122        public void excludeChildren(Object transition, View target, boolean exclude);
123
124        public void include(Object transition, int targetId);
125
126        public void include(Object transition, View targetView);
127
128        public void setStartDelay(Object transition, long startDelay);
129
130        public void setDuration(Object transition, long duration);
131
132        public void setInterpolator(Object transition, Object timeInterpolator);
133
134        public void addTarget(Object transition, View view);
135
136        public Object createDefaultInterpolator(Context context);
137
138        public Object loadTransition(Context context, int resId);
139    }
140
141    /**
142     * Interface used when we do not support Transition animations.
143     */
144    static class TransitionHelperStubImpl implements TransitionHelperVersionImpl {
145
146        private static class TransitionStub {
147            TransitionListener mTransitionListener;
148        }
149
150        public void setEnterTransition(android.app.Fragment fragment, Object transition) {
151        }
152
153        public void setExitTransition(android.app.Fragment fragment, Object transition) {
154        }
155
156        @Override
157        public Object getSharedElementEnterTransition(Window window) {
158            return null;
159        }
160
161        @Override
162        public Object getSharedElementReturnTransition(Window window) {
163            return null;
164        }
165
166        @Override
167        public Object getSharedElementExitTransition(Window window) {
168            return null;
169        }
170
171        @Override
172        public Object getSharedElementReenterTransition(Window window) {
173            return null;
174        }
175
176        @Override
177        public Object getEnterTransition(Window window) {
178            return null;
179        }
180
181        @Override
182        public Object getReturnTransition(Window window) {
183            return null;
184        }
185
186        @Override
187        public Object getExitTransition(Window window) {
188            return null;
189        }
190
191        @Override
192        public Object getReenterTransition(Window window) {
193            return null;
194        }
195
196        @Override
197        public Object createScene(ViewGroup sceneRoot, Runnable r) {
198            return r;
199        }
200
201        @Override
202        public Object createAutoTransition() {
203            return new TransitionStub();
204        }
205
206        @Override
207        public Object createFadeTransition(int fadingMode) {
208            return new TransitionStub();
209        }
210
211        @Override
212        public Object createChangeBounds(boolean reparent) {
213            return new TransitionStub();
214        }
215
216        @Override
217        public Object createFadeAndShortSlide(int edge) {
218            return new TransitionStub();
219        }
220
221        @Override
222        public Object createSlide(int slideEdge) {
223            return new TransitionStub();
224        }
225
226        @Override
227        public Object createScale() {
228            return new TransitionStub();
229        }
230
231        @Override
232        public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
233        }
234
235        @Override
236        public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) {
237        }
238
239        @Override
240        public void setChangeBoundsStartDelay(Object changeBounds, String className,
241                int startDelay) {
242        }
243
244        @Override
245        public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) {
246        }
247
248        @Override
249        public Object createTransitionSet(boolean sequential) {
250            return new TransitionStub();
251        }
252
253        @Override
254        public void addTransition(Object transitionSet, Object transition) {
255        }
256
257        @Override
258        public void exclude(Object transition, int targetId, boolean exclude) {
259        }
260
261        @Override
262        public void exclude(Object transition, View targetView, boolean exclude) {
263        }
264
265        @Override
266        public void excludeChildren(Object transition, int targetId, boolean exclude) {
267        }
268
269        @Override
270        public void excludeChildren(Object transition, View targetView, boolean exclude) {
271        }
272
273        @Override
274        public void include(Object transition, int targetId) {
275        }
276
277        @Override
278        public void include(Object transition, View targetView) {
279        }
280
281        @Override
282        public void setStartDelay(Object transition, long startDelay) {
283        }
284
285        @Override
286        public void setDuration(Object transition, long duration) {
287        }
288
289        @Override
290        public void setTransitionListener(Object transition, TransitionListener listener) {
291            ((TransitionStub) transition).mTransitionListener = listener;
292        }
293
294        @Override
295        public void runTransition(Object scene, Object transition) {
296            TransitionStub transitionStub = (TransitionStub) transition;
297            if (transitionStub != null && transitionStub.mTransitionListener != null) {
298                transitionStub.mTransitionListener.onTransitionStart(transition);
299            }
300            Runnable r = ((Runnable) scene);
301            if (r != null) {
302                r.run();
303            }
304            if (transitionStub != null && transitionStub.mTransitionListener != null) {
305                transitionStub.mTransitionListener.onTransitionEnd(transition);
306            }
307        }
308
309        @Override
310        public void setInterpolator(Object transition, Object timeInterpolator) {
311        }
312
313        @Override
314        public void addTarget(Object transition, View view) {
315        }
316
317        @Override
318        public Object createDefaultInterpolator(Context context) {
319            return null;
320        }
321
322        @Override
323        public Object loadTransition(Context context, int resId) {
324            return new TransitionStub();
325        }
326    }
327
328    /**
329     * Implementation used on KitKat (and above).
330     */
331    static class TransitionHelperKitkatImpl extends TransitionHelperStubImpl {
332
333        @Override
334        public Object createScene(ViewGroup sceneRoot, Runnable r) {
335            return TransitionHelperKitkat.createScene(sceneRoot, r);
336        }
337
338        @Override
339        public Object createAutoTransition() {
340            return TransitionHelperKitkat.createAutoTransition();
341        }
342
343        @Override
344        public Object createFadeTransition(int fadingMode) {
345            return TransitionHelperKitkat.createFadeTransition(fadingMode);
346        }
347
348        @Override
349        public Object createChangeBounds(boolean reparent) {
350            return TransitionHelperKitkat.createChangeBounds(reparent);
351        }
352
353        @Override
354        public Object createSlide(int slideEdge) {
355            return TransitionHelperKitkat.createSlide(slideEdge);
356        }
357
358        @Override
359        public Object createScale() {
360            return TransitionHelperKitkat.createScale();
361        }
362
363        @Override
364        public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
365            TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, view, startDelay);
366        }
367
368        @Override
369        public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) {
370            TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, viewId, startDelay);
371        }
372
373        @Override
374        public void setChangeBoundsStartDelay(Object changeBounds, String className,
375                int startDelay) {
376            TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, className, startDelay);
377        }
378
379        @Override
380        public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) {
381            TransitionHelperKitkat.setChangeBoundsDefaultStartDelay(changeBounds, startDelay);
382        }
383
384        @Override
385        public Object createTransitionSet(boolean sequential) {
386            return TransitionHelperKitkat.createTransitionSet(sequential);
387        }
388
389        @Override
390        public void addTransition(Object transitionSet, Object transition) {
391            TransitionHelperKitkat.addTransition(transitionSet, transition);
392        }
393
394        @Override
395        public void exclude(Object transition, int targetId, boolean exclude) {
396            TransitionHelperKitkat.exclude(transition, targetId, exclude);
397        }
398
399        @Override
400        public void exclude(Object transition, View targetView, boolean exclude) {
401            TransitionHelperKitkat.exclude(transition, targetView, exclude);
402        }
403
404        @Override
405        public void excludeChildren(Object transition, int targetId, boolean exclude) {
406            TransitionHelperKitkat.excludeChildren(transition, targetId, exclude);
407        }
408
409        @Override
410        public void excludeChildren(Object transition, View targetView, boolean exclude) {
411            TransitionHelperKitkat.excludeChildren(transition, targetView, exclude);
412        }
413
414        @Override
415        public void include(Object transition, int targetId) {
416            TransitionHelperKitkat.include(transition, targetId);
417        }
418
419        @Override
420        public void include(Object transition, View targetView) {
421            TransitionHelperKitkat.include(transition, targetView);
422        }
423
424        @Override
425        public void setStartDelay(Object transition, long startDelay) {
426            TransitionHelperKitkat.setStartDelay(transition, startDelay);
427        }
428
429        @Override
430        public void setDuration(Object transition, long duration) {
431            TransitionHelperKitkat.setDuration(transition, duration);
432        }
433
434        @Override
435        public void setTransitionListener(Object transition, TransitionListener listener) {
436            TransitionHelperKitkat.setTransitionListener(transition, listener);
437        }
438
439        @Override
440        public void runTransition(Object scene, Object transition) {
441            TransitionHelperKitkat.runTransition(scene, transition);
442        }
443
444        @Override
445        public void setInterpolator(Object transition, Object timeInterpolator) {
446            TransitionHelperKitkat.setInterpolator(transition, timeInterpolator);
447        }
448
449        @Override
450        public void addTarget(Object transition, View view) {
451            TransitionHelperKitkat.addTarget(transition, view);
452        }
453
454        @Override
455        public Object createDefaultInterpolator(Context context) {
456            return null;
457        }
458
459        @Override
460        public Object loadTransition(Context context, int resId) {
461            return TransitionHelperKitkat.loadTransition(context, resId);
462        }
463    }
464
465    static final class TransitionHelperApi21Impl extends TransitionHelperKitkatImpl {
466
467        public void setEnterTransition(android.app.Fragment fragment, Object transition) {
468            TransitionHelperApi21.setEnterTransition(fragment, transition);
469        }
470
471        public void setExitTransition(android.app.Fragment fragment, Object transition) {
472            TransitionHelperApi21.setExitTransition(fragment, transition);
473        }
474
475        @Override
476        public Object getSharedElementEnterTransition(Window window) {
477            return TransitionHelperApi21.getSharedElementEnterTransition(window);
478        }
479
480        @Override
481        public Object getSharedElementReturnTransition(Window window) {
482            return TransitionHelperApi21.getSharedElementReturnTransition(window);
483        }
484
485        @Override
486        public Object getSharedElementExitTransition(Window window) {
487            return TransitionHelperApi21.getSharedElementExitTransition(window);
488        }
489
490        @Override
491        public Object getSharedElementReenterTransition(Window window) {
492            return TransitionHelperApi21.getSharedElementReenterTransition(window);
493        }
494
495        @Override
496        public Object createFadeAndShortSlide(int edge) {
497            return TransitionHelperApi21.createFadeAndShortSlide(edge);
498        }
499
500        @Override
501        public Object getEnterTransition(Window window) {
502            return TransitionHelperApi21.getEnterTransition(window);
503        }
504
505        @Override
506        public Object getReturnTransition(Window window) {
507            return TransitionHelperApi21.getReturnTransition(window);
508        }
509
510        @Override
511        public Object getExitTransition(Window window) {
512            return TransitionHelperApi21.getExitTransition(window);
513        }
514
515        @Override
516        public Object getReenterTransition(Window window) {
517            return TransitionHelperApi21.getReenterTransition(window);
518        }
519
520        @Override
521        public Object createScale() {
522            return TransitionHelperApi21.createScale();
523        }
524
525        @Override
526        public Object createDefaultInterpolator(Context context) {
527            return TransitionHelperApi21.createDefaultInterpolator(context);
528        }
529    }
530
531    /**
532     * Returns the TransitionHelper that can be used to perform Transition
533     * animations.
534     */
535    public static TransitionHelper getInstance() {
536        return sHelper;
537    }
538
539    private TransitionHelper() {
540        if (Build.VERSION.SDK_INT >= 21) {
541            mImpl = new TransitionHelperApi21Impl();
542        } else  if (systemSupportsTransitions()) {
543            mImpl = new TransitionHelperKitkatImpl();
544        } else {
545            mImpl = new TransitionHelperStubImpl();
546        }
547    }
548
549    public Object getSharedElementEnterTransition(Window window) {
550        return mImpl.getSharedElementEnterTransition(window);
551    }
552
553    public Object getSharedElementReturnTransition(Window window) {
554        return mImpl.getSharedElementReturnTransition(window);
555    }
556
557    public Object getSharedElementExitTransition(Window window) {
558        return mImpl.getSharedElementExitTransition(window);
559    }
560
561    public Object getSharedElementReenterTransition(Window window) {
562        return mImpl.getSharedElementReenterTransition(window);
563    }
564
565    public Object getEnterTransition(Window window) {
566        return mImpl.getEnterTransition(window);
567    }
568
569    public Object getReturnTransition(Window window) {
570        return mImpl.getReturnTransition(window);
571    }
572
573    public Object getExitTransition(Window window) {
574        return mImpl.getExitTransition(window);
575    }
576
577    public Object getReenterTransition(Window window) {
578        return mImpl.getReenterTransition(window);
579    }
580
581    public Object createScene(ViewGroup sceneRoot, Runnable r) {
582        return mImpl.createScene(sceneRoot, r);
583    }
584
585    public Object createChangeBounds(boolean reparent) {
586        return mImpl.createChangeBounds(reparent);
587    }
588
589    public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
590        mImpl.setChangeBoundsStartDelay(changeBounds, view, startDelay);
591    }
592
593    public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) {
594        mImpl.setChangeBoundsStartDelay(changeBounds, viewId, startDelay);
595    }
596
597    public void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) {
598        mImpl.setChangeBoundsStartDelay(changeBounds, className, startDelay);
599    }
600
601    public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) {
602        mImpl.setChangeBoundsDefaultStartDelay(changeBounds, startDelay);
603    }
604
605    public Object createTransitionSet(boolean sequential) {
606        return mImpl.createTransitionSet(sequential);
607    }
608
609    public Object createSlide(int slideEdge) {
610        return mImpl.createSlide(slideEdge);
611    }
612
613    public Object createScale() {
614        return mImpl.createScale();
615    }
616
617    public void addTransition(Object transitionSet, Object transition) {
618        mImpl.addTransition(transitionSet, transition);
619    }
620
621    public void exclude(Object transition, int targetId, boolean exclude) {
622        mImpl.exclude(transition, targetId, exclude);
623    }
624
625    public void exclude(Object transition, View targetView, boolean exclude) {
626        mImpl.exclude(transition, targetView, exclude);
627    }
628
629    public void excludeChildren(Object transition, int targetId, boolean exclude) {
630        mImpl.excludeChildren(transition, targetId, exclude);
631    }
632
633    public void excludeChildren(Object transition, View targetView, boolean exclude) {
634        mImpl.excludeChildren(transition, targetView, exclude);
635    }
636
637    public void include(Object transition, int targetId) {
638        mImpl.include(transition, targetId);
639    }
640
641    public void include(Object transition, View targetView) {
642        mImpl.include(transition, targetView);
643    }
644
645    public void setStartDelay(Object transition, long startDelay) {
646        mImpl.setStartDelay(transition, startDelay);
647    }
648
649    public void setDuration(Object transition, long duration) {
650        mImpl.setDuration(transition, duration);
651    }
652
653    public Object createAutoTransition() {
654        return mImpl.createAutoTransition();
655    }
656
657    public Object createFadeTransition(int fadeMode) {
658        return mImpl.createFadeTransition(fadeMode);
659    }
660
661    public void setTransitionListener(Object transition, TransitionListener listener) {
662        mImpl.setTransitionListener(transition, listener);
663    }
664
665    public void runTransition(Object scene, Object transition) {
666        mImpl.runTransition(scene, transition);
667    }
668
669    public void setInterpolator(Object transition, Object timeInterpolator) {
670        mImpl.setInterpolator(transition, timeInterpolator);
671    }
672
673    public void addTarget(Object transition, View view) {
674        mImpl.addTarget(transition, view);
675    }
676
677    public Object createDefaultInterpolator(Context context) {
678        return mImpl.createDefaultInterpolator(context);
679    }
680
681    public Object loadTransition(Context context, int resId) {
682        return mImpl.loadTransition(context, resId);
683    }
684
685    public void setEnterTransition(android.app.Fragment fragment, Object transition) {
686        mImpl.setEnterTransition(fragment, transition);
687    }
688
689    public void setExitTransition(android.app.Fragment fragment, Object transition) {
690        mImpl.setExitTransition(fragment, transition);
691    }
692
693    public void setEnterTransition(android.support.v4.app.Fragment fragment, Object transition) {
694        fragment.setEnterTransition(transition);
695    }
696
697    public void setExitTransition(android.support.v4.app.Fragment fragment, Object transition) {
698        fragment.setExitTransition(transition);
699    }
700
701    public Object createFadeAndShortSlide(int edge) {
702        return mImpl.createFadeAndShortSlide(edge);
703    }
704}
705