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