1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.tv.onboarding;
18
19import android.animation.Animator;
20import android.animation.AnimatorInflater;
21import android.animation.AnimatorListenerAdapter;
22import android.animation.AnimatorSet;
23import android.app.Activity;
24import android.content.Context;
25import android.os.Bundle;
26import android.support.annotation.Nullable;
27import android.support.v17.leanback.app.OnboardingFragment;
28import android.view.Gravity;
29import android.view.LayoutInflater;
30import android.view.View;
31import android.view.ViewGroup;
32import android.widget.ImageView;
33
34import com.android.tv.R;
35import com.android.tv.common.ui.setup.SetupActionHelper;
36import com.android.tv.common.ui.setup.animation.SetupAnimationHelper;
37
38import java.util.ArrayList;
39import java.util.List;
40
41/**
42 * A fragment for the onboarding welcome screen.
43 */
44public class WelcomeFragment extends OnboardingFragment {
45    public static final String ACTION_CATEGORY = "comgoogle.android.tv.onboarding.WelcomeFragment";
46    public static final int ACTION_NEXT = 1;
47
48    private static final long START_DELAY_CLOUD_MS = 33;
49    private static final long START_DELAY_TV_MS = 567;
50    private static final long START_DELAY_TV_CONTENTS_MS = 833;
51    private static final long START_DELAY_SHADOW_MS = 567;
52
53    private static final long VIDEO_FADE_OUT_DURATION_MS = 333;
54
55    private static final long BLUE_SCREEN_HOLD_DURATION_MS = 1500;
56
57    // TODO: Use animator list xml.
58    private static final int[] TV_FRAMES_1_START = {
59            R.drawable.tv_1a_01,
60            R.drawable.tv_1a_02,
61            R.drawable.tv_1a_03,
62            R.drawable.tv_1a_04,
63            R.drawable.tv_1a_05,
64            R.drawable.tv_1a_06,
65            R.drawable.tv_1a_07,
66            R.drawable.tv_1a_08,
67            R.drawable.tv_1a_09,
68            R.drawable.tv_1a_10,
69            R.drawable.tv_1a_11,
70            R.drawable.tv_1a_12,
71            R.drawable.tv_1a_13,
72            R.drawable.tv_1a_14,
73            R.drawable.tv_1a_15,
74            R.drawable.tv_1a_16,
75            R.drawable.tv_1a_17,
76            R.drawable.tv_1a_18,
77            R.drawable.tv_1a_19,
78            R.drawable.tv_1a_20
79    };
80
81    private static final int[] TV_FRAMES_1_END = {
82            R.drawable.tv_1b_01,
83            R.drawable.tv_1b_02,
84            R.drawable.tv_1b_03,
85            R.drawable.tv_1b_04,
86            R.drawable.tv_1b_05,
87            R.drawable.tv_1b_06,
88            R.drawable.tv_1b_07,
89            R.drawable.tv_1b_08,
90            R.drawable.tv_1b_09,
91            R.drawable.tv_1b_10,
92            R.drawable.tv_1b_11
93    };
94
95    private static final int[] TV_FRAMES_2_START = {
96            R.drawable.tv_5a_0,
97            R.drawable.tv_5a_1,
98            R.drawable.tv_5a_2,
99            R.drawable.tv_5a_3,
100            R.drawable.tv_5a_4,
101            R.drawable.tv_5a_5,
102            R.drawable.tv_5a_6,
103            R.drawable.tv_5a_7,
104            R.drawable.tv_5a_8,
105            R.drawable.tv_5a_9,
106            R.drawable.tv_5a_10,
107            R.drawable.tv_5a_11,
108            R.drawable.tv_5a_12,
109            R.drawable.tv_5a_13,
110            R.drawable.tv_5a_14,
111            R.drawable.tv_5a_15,
112            R.drawable.tv_5a_16,
113            R.drawable.tv_5a_17,
114            R.drawable.tv_5a_18,
115            R.drawable.tv_5a_19,
116            R.drawable.tv_5a_20,
117            R.drawable.tv_5a_21,
118            R.drawable.tv_5a_22,
119            R.drawable.tv_5a_23,
120            R.drawable.tv_5a_24,
121            R.drawable.tv_5a_25,
122            R.drawable.tv_5a_26,
123            R.drawable.tv_5a_27,
124            R.drawable.tv_5a_28,
125            R.drawable.tv_5a_29,
126            R.drawable.tv_5a_30,
127            R.drawable.tv_5a_31,
128            R.drawable.tv_5a_32,
129            R.drawable.tv_5a_33,
130            R.drawable.tv_5a_34,
131            R.drawable.tv_5a_35,
132            R.drawable.tv_5a_36,
133            R.drawable.tv_5a_37,
134            R.drawable.tv_5a_38,
135            R.drawable.tv_5a_39,
136            R.drawable.tv_5a_40,
137            R.drawable.tv_5a_41,
138            R.drawable.tv_5a_42,
139            R.drawable.tv_5a_43,
140            R.drawable.tv_5a_44,
141            R.drawable.tv_5a_45,
142            R.drawable.tv_5a_46,
143            R.drawable.tv_5a_47,
144            R.drawable.tv_5a_48,
145            R.drawable.tv_5a_49,
146            R.drawable.tv_5a_50,
147            R.drawable.tv_5a_51,
148            R.drawable.tv_5a_52,
149            R.drawable.tv_5a_53,
150            R.drawable.tv_5a_54,
151            R.drawable.tv_5a_55,
152            R.drawable.tv_5a_56,
153            R.drawable.tv_5a_57,
154            R.drawable.tv_5a_58,
155            R.drawable.tv_5a_59,
156            R.drawable.tv_5a_60,
157            R.drawable.tv_5a_61,
158            R.drawable.tv_5a_62,
159            R.drawable.tv_5a_63,
160            R.drawable.tv_5a_64,
161            R.drawable.tv_5a_65,
162            R.drawable.tv_5a_66,
163            R.drawable.tv_5a_67,
164            R.drawable.tv_5a_68,
165            R.drawable.tv_5a_69,
166            R.drawable.tv_5a_70,
167            R.drawable.tv_5a_71,
168            R.drawable.tv_5a_72,
169            R.drawable.tv_5a_73,
170            R.drawable.tv_5a_74,
171            R.drawable.tv_5a_75,
172            R.drawable.tv_5a_76,
173            R.drawable.tv_5a_77,
174            R.drawable.tv_5a_78,
175            R.drawable.tv_5a_79,
176            R.drawable.tv_5a_80,
177            R.drawable.tv_5a_81,
178            R.drawable.tv_5a_82,
179            R.drawable.tv_5a_83,
180            R.drawable.tv_5a_84,
181            R.drawable.tv_5a_85,
182            R.drawable.tv_5a_86,
183            R.drawable.tv_5a_87,
184            R.drawable.tv_5a_88,
185            R.drawable.tv_5a_89,
186            R.drawable.tv_5a_90,
187            R.drawable.tv_5a_91,
188            R.drawable.tv_5a_92,
189            R.drawable.tv_5a_93,
190            R.drawable.tv_5a_94,
191            R.drawable.tv_5a_95,
192            R.drawable.tv_5a_96,
193            R.drawable.tv_5a_97,
194            R.drawable.tv_5a_98,
195            R.drawable.tv_5a_99,
196            R.drawable.tv_5a_100,
197            R.drawable.tv_5a_101,
198            R.drawable.tv_5a_102,
199            R.drawable.tv_5a_103,
200            R.drawable.tv_5a_104,
201            R.drawable.tv_5a_105,
202            R.drawable.tv_5a_106,
203            R.drawable.tv_5a_107,
204            R.drawable.tv_5a_108,
205            R.drawable.tv_5a_109,
206            R.drawable.tv_5a_110,
207            R.drawable.tv_5a_111,
208            R.drawable.tv_5a_112,
209            R.drawable.tv_5a_113,
210            R.drawable.tv_5a_114,
211            R.drawable.tv_5a_115,
212            R.drawable.tv_5a_116,
213            R.drawable.tv_5a_117,
214            R.drawable.tv_5a_118,
215            R.drawable.tv_5a_119,
216            R.drawable.tv_5a_120,
217            R.drawable.tv_5a_121,
218            R.drawable.tv_5a_122,
219            R.drawable.tv_5a_123,
220            R.drawable.tv_5a_124,
221            R.drawable.tv_5a_125,
222            R.drawable.tv_5a_126,
223            R.drawable.tv_5a_127,
224            R.drawable.tv_5a_128,
225            R.drawable.tv_5a_129,
226            R.drawable.tv_5a_130,
227            R.drawable.tv_5a_131,
228            R.drawable.tv_5a_132,
229            R.drawable.tv_5a_133,
230            R.drawable.tv_5a_134,
231            R.drawable.tv_5a_135,
232            R.drawable.tv_5a_136,
233            R.drawable.tv_5a_137,
234            R.drawable.tv_5a_138,
235            R.drawable.tv_5a_139,
236            R.drawable.tv_5a_140,
237            R.drawable.tv_5a_141,
238            R.drawable.tv_5a_142,
239            R.drawable.tv_5a_143,
240            R.drawable.tv_5a_144,
241            R.drawable.tv_5a_145,
242            R.drawable.tv_5a_146,
243            R.drawable.tv_5a_147,
244            R.drawable.tv_5a_148,
245            R.drawable.tv_5a_149,
246            R.drawable.tv_5a_150,
247            R.drawable.tv_5a_151,
248            R.drawable.tv_5a_152,
249            R.drawable.tv_5a_153,
250            R.drawable.tv_5a_154,
251            R.drawable.tv_5a_155,
252            R.drawable.tv_5a_156,
253            R.drawable.tv_5a_157,
254            R.drawable.tv_5a_158,
255            R.drawable.tv_5a_159,
256            R.drawable.tv_5a_160,
257            R.drawable.tv_5a_161,
258            R.drawable.tv_5a_162,
259            R.drawable.tv_5a_163,
260            R.drawable.tv_5a_164,
261            R.drawable.tv_5a_165,
262            R.drawable.tv_5a_166,
263            R.drawable.tv_5a_167,
264            R.drawable.tv_5a_168,
265            R.drawable.tv_5a_169,
266            R.drawable.tv_5a_170,
267            R.drawable.tv_5a_171,
268            R.drawable.tv_5a_172,
269            R.drawable.tv_5a_173,
270            R.drawable.tv_5a_174,
271            R.drawable.tv_5a_175,
272            R.drawable.tv_5a_176,
273            R.drawable.tv_5a_177,
274            R.drawable.tv_5a_178,
275            R.drawable.tv_5a_179,
276            R.drawable.tv_5a_180,
277            R.drawable.tv_5a_181,
278            R.drawable.tv_5a_182,
279            R.drawable.tv_5a_183,
280            R.drawable.tv_5a_184,
281            R.drawable.tv_5a_185,
282            R.drawable.tv_5a_186,
283            R.drawable.tv_5a_187,
284            R.drawable.tv_5a_188,
285            R.drawable.tv_5a_189,
286            R.drawable.tv_5a_190,
287            R.drawable.tv_5a_191,
288            R.drawable.tv_5a_192,
289            R.drawable.tv_5a_193,
290            R.drawable.tv_5a_194,
291            R.drawable.tv_5a_195,
292            R.drawable.tv_5a_196,
293            R.drawable.tv_5a_197,
294            R.drawable.tv_5a_198,
295            R.drawable.tv_5a_199,
296            R.drawable.tv_5a_200,
297            R.drawable.tv_5a_201,
298            R.drawable.tv_5a_202,
299            R.drawable.tv_5a_203,
300            R.drawable.tv_5a_204,
301            R.drawable.tv_5a_205,
302            R.drawable.tv_5a_206,
303            R.drawable.tv_5a_207,
304            R.drawable.tv_5a_208,
305            R.drawable.tv_5a_209,
306            R.drawable.tv_5a_210,
307            R.drawable.tv_5a_211,
308            R.drawable.tv_5a_212,
309            R.drawable.tv_5a_213,
310            R.drawable.tv_5a_214,
311            R.drawable.tv_5a_215,
312            R.drawable.tv_5a_216,
313            R.drawable.tv_5a_217,
314            R.drawable.tv_5a_218,
315            R.drawable.tv_5a_219,
316            R.drawable.tv_5a_220,
317            R.drawable.tv_5a_221,
318            R.drawable.tv_5a_222,
319            R.drawable.tv_5a_223,
320            R.drawable.tv_5a_224
321    };
322
323    private static final int[] TV_FRAMES_3_BLUE_ARROW = {
324            R.drawable.arrow_blue_00,
325            R.drawable.arrow_blue_01,
326            R.drawable.arrow_blue_02,
327            R.drawable.arrow_blue_03,
328            R.drawable.arrow_blue_04,
329            R.drawable.arrow_blue_05,
330            R.drawable.arrow_blue_06,
331            R.drawable.arrow_blue_07,
332            R.drawable.arrow_blue_08,
333            R.drawable.arrow_blue_09,
334            R.drawable.arrow_blue_10,
335            R.drawable.arrow_blue_11,
336            R.drawable.arrow_blue_12,
337            R.drawable.arrow_blue_13,
338            R.drawable.arrow_blue_14,
339            R.drawable.arrow_blue_15,
340            R.drawable.arrow_blue_16,
341            R.drawable.arrow_blue_17,
342            R.drawable.arrow_blue_18,
343            R.drawable.arrow_blue_19,
344            R.drawable.arrow_blue_20,
345            R.drawable.arrow_blue_21,
346            R.drawable.arrow_blue_22,
347            R.drawable.arrow_blue_23,
348            R.drawable.arrow_blue_24,
349            R.drawable.arrow_blue_25,
350            R.drawable.arrow_blue_26,
351            R.drawable.arrow_blue_27,
352            R.drawable.arrow_blue_28,
353            R.drawable.arrow_blue_29,
354            R.drawable.arrow_blue_30,
355            R.drawable.arrow_blue_31,
356            R.drawable.arrow_blue_32,
357            R.drawable.arrow_blue_33,
358            R.drawable.arrow_blue_34,
359            R.drawable.arrow_blue_35,
360            R.drawable.arrow_blue_36,
361            R.drawable.arrow_blue_37,
362            R.drawable.arrow_blue_38,
363            R.drawable.arrow_blue_39,
364            R.drawable.arrow_blue_40,
365            R.drawable.arrow_blue_41,
366            R.drawable.arrow_blue_42,
367            R.drawable.arrow_blue_43,
368            R.drawable.arrow_blue_44,
369            R.drawable.arrow_blue_45,
370            R.drawable.arrow_blue_46,
371            R.drawable.arrow_blue_47,
372            R.drawable.arrow_blue_48,
373            R.drawable.arrow_blue_49,
374            R.drawable.arrow_blue_50,
375            R.drawable.arrow_blue_51,
376            R.drawable.arrow_blue_52,
377            R.drawable.arrow_blue_53,
378            R.drawable.arrow_blue_54,
379            R.drawable.arrow_blue_55,
380            R.drawable.arrow_blue_56,
381            R.drawable.arrow_blue_57,
382            R.drawable.arrow_blue_58,
383            R.drawable.arrow_blue_59,
384            R.drawable.arrow_blue_60
385    };
386
387    private static final int[] TV_FRAMES_3_BLUE_START = {
388            R.drawable.tv_2a_01,
389            R.drawable.tv_2a_02,
390            R.drawable.tv_2a_03,
391            R.drawable.tv_2a_04,
392            R.drawable.tv_2a_05,
393            R.drawable.tv_2a_06,
394            R.drawable.tv_2a_07,
395            R.drawable.tv_2a_08,
396            R.drawable.tv_2a_09,
397            R.drawable.tv_2a_10,
398            R.drawable.tv_2a_11,
399            R.drawable.tv_2a_12,
400            R.drawable.tv_2a_13,
401            R.drawable.tv_2a_14,
402            R.drawable.tv_2a_15,
403            R.drawable.tv_2a_16,
404            R.drawable.tv_2a_17,
405            R.drawable.tv_2a_18,
406            R.drawable.tv_2a_19
407    };
408
409    private static final int[] TV_FRAMES_3_BLUE_END = {
410            R.drawable.tv_2b_01,
411            R.drawable.tv_2b_02,
412            R.drawable.tv_2b_03,
413            R.drawable.tv_2b_04,
414            R.drawable.tv_2b_05,
415            R.drawable.tv_2b_06,
416            R.drawable.tv_2b_07,
417            R.drawable.tv_2b_08,
418            R.drawable.tv_2b_09,
419            R.drawable.tv_2b_10,
420            R.drawable.tv_2b_11,
421            R.drawable.tv_2b_12,
422            R.drawable.tv_2b_13,
423            R.drawable.tv_2b_14,
424            R.drawable.tv_2b_15,
425            R.drawable.tv_2b_16,
426            R.drawable.tv_2b_17,
427            R.drawable.tv_2b_18,
428            R.drawable.tv_2b_19
429    };
430
431    private static final int[] TV_FRAMES_3_ORANGE_ARROW = {
432            R.drawable.arrow_orange_180,
433            R.drawable.arrow_orange_181,
434            R.drawable.arrow_orange_182,
435            R.drawable.arrow_orange_183,
436            R.drawable.arrow_orange_184,
437            R.drawable.arrow_orange_185,
438            R.drawable.arrow_orange_186,
439            R.drawable.arrow_orange_187,
440            R.drawable.arrow_orange_188,
441            R.drawable.arrow_orange_189,
442            R.drawable.arrow_orange_190,
443            R.drawable.arrow_orange_191,
444            R.drawable.arrow_orange_192,
445            R.drawable.arrow_orange_193,
446            R.drawable.arrow_orange_194,
447            R.drawable.arrow_orange_195,
448            R.drawable.arrow_orange_196,
449            R.drawable.arrow_orange_197,
450            R.drawable.arrow_orange_198,
451            R.drawable.arrow_orange_199,
452            R.drawable.arrow_orange_200,
453            R.drawable.arrow_orange_201,
454            R.drawable.arrow_orange_202,
455            R.drawable.arrow_orange_203,
456            R.drawable.arrow_orange_204,
457            R.drawable.arrow_orange_205,
458            R.drawable.arrow_orange_206,
459            R.drawable.arrow_orange_207,
460            R.drawable.arrow_orange_208,
461            R.drawable.arrow_orange_209,
462            R.drawable.arrow_orange_210,
463            R.drawable.arrow_orange_211,
464            R.drawable.arrow_orange_212,
465            R.drawable.arrow_orange_213,
466            R.drawable.arrow_orange_214,
467            R.drawable.arrow_orange_215,
468            R.drawable.arrow_orange_216,
469            R.drawable.arrow_orange_217,
470            R.drawable.arrow_orange_218,
471            R.drawable.arrow_orange_219,
472            R.drawable.arrow_orange_220,
473            R.drawable.arrow_orange_221,
474            R.drawable.arrow_orange_222,
475            R.drawable.arrow_orange_223,
476            R.drawable.arrow_orange_224,
477            R.drawable.arrow_orange_225,
478            R.drawable.arrow_orange_226,
479            R.drawable.arrow_orange_227,
480            R.drawable.arrow_orange_228,
481            R.drawable.arrow_orange_229,
482            R.drawable.arrow_orange_230,
483            R.drawable.arrow_orange_231,
484            R.drawable.arrow_orange_232,
485            R.drawable.arrow_orange_233,
486            R.drawable.arrow_orange_234,
487            R.drawable.arrow_orange_235,
488            R.drawable.arrow_orange_236,
489            R.drawable.arrow_orange_237,
490            R.drawable.arrow_orange_238,
491            R.drawable.arrow_orange_239,
492            R.drawable.arrow_orange_240
493    };
494
495    private static final int[] TV_FRAMES_3_ORANGE_START = {
496            R.drawable.tv_2c_01,
497            R.drawable.tv_2c_02,
498            R.drawable.tv_2c_03,
499            R.drawable.tv_2c_04,
500            R.drawable.tv_2c_05,
501            R.drawable.tv_2c_06,
502            R.drawable.tv_2c_07,
503            R.drawable.tv_2c_08,
504            R.drawable.tv_2c_09,
505            R.drawable.tv_2c_10,
506            R.drawable.tv_2c_11,
507            R.drawable.tv_2c_12,
508            R.drawable.tv_2c_13,
509            R.drawable.tv_2c_14,
510            R.drawable.tv_2c_15,
511            R.drawable.tv_2c_16
512    };
513
514    private static final int[] TV_FRAMES_4_START = {
515            R.drawable.tv_3a_01,
516            R.drawable.tv_3a_02,
517            R.drawable.tv_3a_03,
518            R.drawable.tv_3a_04,
519            R.drawable.tv_3a_05,
520            R.drawable.tv_3a_06,
521            R.drawable.tv_3a_07,
522            R.drawable.tv_3a_08,
523            R.drawable.tv_3a_09,
524            R.drawable.tv_3a_10,
525            R.drawable.tv_3a_11,
526            R.drawable.tv_3a_12,
527            R.drawable.tv_3a_13,
528            R.drawable.tv_3a_14,
529            R.drawable.tv_3a_15,
530            R.drawable.tv_3a_16,
531            R.drawable.tv_3a_17,
532            R.drawable.tv_3b_75,
533            R.drawable.tv_3b_76,
534            R.drawable.tv_3b_77,
535            R.drawable.tv_3b_78,
536            R.drawable.tv_3b_79,
537            R.drawable.tv_3b_80,
538            R.drawable.tv_3b_81,
539            R.drawable.tv_3b_82,
540            R.drawable.tv_3b_83,
541            R.drawable.tv_3b_84,
542            R.drawable.tv_3b_85,
543            R.drawable.tv_3b_86,
544            R.drawable.tv_3b_87,
545            R.drawable.tv_3b_88,
546            R.drawable.tv_3b_89,
547            R.drawable.tv_3b_90,
548            R.drawable.tv_3b_91,
549            R.drawable.tv_3b_92,
550            R.drawable.tv_3b_93,
551            R.drawable.tv_3b_94,
552            R.drawable.tv_3b_95,
553            R.drawable.tv_3b_96,
554            R.drawable.tv_3b_97,
555            R.drawable.tv_3b_98,
556            R.drawable.tv_3b_99,
557            R.drawable.tv_3b_100,
558            R.drawable.tv_3b_101,
559            R.drawable.tv_3b_102,
560            R.drawable.tv_3b_103,
561            R.drawable.tv_3b_104,
562            R.drawable.tv_3b_105,
563            R.drawable.tv_3b_106,
564            R.drawable.tv_3b_107,
565            R.drawable.tv_3b_108,
566            R.drawable.tv_3b_109,
567            R.drawable.tv_3b_110,
568            R.drawable.tv_3b_111,
569            R.drawable.tv_3b_112,
570            R.drawable.tv_3b_113,
571            R.drawable.tv_3b_114,
572            R.drawable.tv_3b_115,
573            R.drawable.tv_3b_116,
574            R.drawable.tv_3b_117,
575            R.drawable.tv_3b_118
576    };
577
578    private String[] mPageTitles;
579    private String[] mPageDescriptions;
580
581    private ImageView mTvContentView;
582    private ImageView mArrowView;
583
584    private Animator mAnimator;
585
586    public WelcomeFragment() {
587        setExitTransition(new SetupAnimationHelper.TransitionBuilder()
588                .setSlideEdge(Gravity.START)
589                .setParentIdsForDelay(new int[]{R.id.onboarding_fragment_root})
590                .build());
591    }
592
593    @Override
594    public void onAttach(Activity activity) {
595        super.onAttach(activity);
596        initialize();
597    }
598
599    @Override
600    public void onAttach(Context context) {
601        super.onAttach(context);
602        initialize();
603    }
604
605    private void initialize() {
606        if (mPageTitles == null) {
607            mPageTitles = getResources().getStringArray(R.array.welcome_page_titles);
608            mPageDescriptions = getResources().getStringArray(R.array.welcome_page_descriptions);
609        }
610    }
611
612    @Nullable
613    @Override
614    public View onCreateView(LayoutInflater inflater, ViewGroup container,
615            Bundle savedInstanceState) {
616        View view = super.onCreateView(inflater, container, savedInstanceState);
617        setLogoResourceId(R.drawable.splash_logo);
618        if (savedInstanceState != null) {
619            switch (getCurrentPageIndex()) {
620                case 0:
621                    mTvContentView.setImageResource(
622                            TV_FRAMES_1_START[TV_FRAMES_1_START.length - 1]);
623                    break;
624                case 1:
625                    mTvContentView.setImageResource(
626                            TV_FRAMES_2_START[TV_FRAMES_2_START.length - 1]);
627                    break;
628                case 2:
629                    mTvContentView.setImageResource(
630                            TV_FRAMES_3_ORANGE_START[TV_FRAMES_3_ORANGE_START.length - 1]);
631                    mArrowView.setImageResource(TV_FRAMES_3_BLUE_ARROW[0]);
632                    break;
633                case 3:
634                default:
635                    mTvContentView.setImageResource(
636                            TV_FRAMES_4_START[TV_FRAMES_4_START.length - 1]);
637                    break;
638            }
639        }
640        return view;
641    }
642
643    @Override
644    public int onProvideTheme() {
645        return R.style.Theme_Leanback_Onboarding;
646    }
647
648    @Override
649    protected Animator onCreateEnterAnimation() {
650        List<Animator> animators = new ArrayList<>();
651        // Cloud 1
652        View view = getActivity().findViewById(R.id.cloud1);
653        view.setAlpha(0);
654        Animator animator = AnimatorInflater.loadAnimator(getActivity(),
655                R.animator.onboarding_welcome_cloud_enter);
656        animator.setStartDelay(START_DELAY_CLOUD_MS);
657        animator.setTarget(view);
658        animators.add(animator);
659        // Cloud 2
660        view = getActivity().findViewById(R.id.cloud2);
661        view.setAlpha(0);
662        animator = AnimatorInflater.loadAnimator(getActivity(),
663                R.animator.onboarding_welcome_cloud_enter);
664        animator.setStartDelay(START_DELAY_CLOUD_MS);
665        animator.setTarget(view);
666        animators.add(animator);
667        // TV container
668        view = getActivity().findViewById(R.id.tv_container);
669        view.setAlpha(0);
670        animator = AnimatorInflater.loadAnimator(getActivity(),
671                R.animator.onboarding_welcome_tv_enter);
672        animator.setStartDelay(START_DELAY_TV_MS);
673        animator.setTarget(view);
674        animators.add(animator);
675        // TV content
676        view = getActivity().findViewById(R.id.tv_content);
677        animator = SetupAnimationHelper.createFrameAnimator((ImageView) view, TV_FRAMES_1_START);
678        animator.setStartDelay(START_DELAY_TV_CONTENTS_MS);
679        animator.setTarget(view);
680        animators.add(animator);
681        // Shadow
682        view = getActivity().findViewById(R.id.shadow);
683        view.setAlpha(0);
684        animator = AnimatorInflater.loadAnimator(getActivity(),
685                R.animator.onboarding_welcome_shadow_enter);
686        animator.setStartDelay(START_DELAY_SHADOW_MS);
687        animator.setTarget(view);
688        animators.add(animator);
689        AnimatorSet set = new AnimatorSet();
690        set.playTogether(animators);
691        return set;
692    }
693
694    @Nullable
695    @Override
696    protected View onCreateBackgroundView(LayoutInflater inflater, ViewGroup container) {
697        return inflater.inflate(R.layout.onboarding_welcome_background, container, false);
698    }
699
700    @Nullable
701    @Override
702    protected View onCreateContentView(LayoutInflater inflater, ViewGroup container) {
703        View view = inflater.inflate(R.layout.onboarding_welcome_content, container, false);
704        mTvContentView = (ImageView) view.findViewById(R.id.tv_content);
705        return view;
706    }
707
708    @Nullable
709    @Override
710    protected View onCreateForegroundView(LayoutInflater inflater, ViewGroup container) {
711        mArrowView = (ImageView) inflater.inflate(R.layout.onboarding_welcome_foreground, container,
712                false);
713        return mArrowView;
714    }
715
716    @Override
717    protected int getPageCount() {
718        return mPageTitles.length;
719    }
720
721    @Override
722    protected String getPageTitle(int pageIndex) {
723        return mPageTitles[pageIndex];
724    }
725
726    @Override
727    protected String getPageDescription(int pageIndex) {
728        return mPageDescriptions[pageIndex];
729    }
730
731    @Override
732    protected void onFinishFragment() {
733        SetupActionHelper.onActionClick(WelcomeFragment.this, ACTION_CATEGORY, ACTION_NEXT);
734    }
735
736    @Override
737    protected void onPageChanged(int newPage, int previousPage) {
738        if (mAnimator != null) {
739            mAnimator.cancel();
740        }
741        mArrowView.setVisibility(View.GONE);
742        // TV screen hiding animator.
743        Animator hideAnimator = previousPage == 0
744                ? SetupAnimationHelper.createFrameAnimator(mTvContentView, TV_FRAMES_1_END)
745                : SetupAnimationHelper.createFadeOutAnimator(mTvContentView,
746                VIDEO_FADE_OUT_DURATION_MS, true);
747        // TV screen showing animator.
748        AnimatorSet animatorSet = new AnimatorSet();
749        int firstFrame;
750        switch (newPage) {
751            case 0:
752                animatorSet.playSequentially(hideAnimator,
753                        SetupAnimationHelper.createFrameAnimator(mTvContentView,
754                                TV_FRAMES_1_START));
755                firstFrame = TV_FRAMES_1_START[0];
756                break;
757            case 1:
758                animatorSet.playSequentially(hideAnimator,
759                        SetupAnimationHelper.createFrameAnimator(mTvContentView,
760                                TV_FRAMES_2_START));
761                firstFrame = TV_FRAMES_2_START[0];
762                break;
763            case 2:
764                mArrowView.setVisibility(View.VISIBLE);
765                animatorSet.playSequentially(hideAnimator,
766                        SetupAnimationHelper.createFrameAnimator(mArrowView,
767                                TV_FRAMES_3_BLUE_ARROW),
768                        SetupAnimationHelper.createFrameAnimator(mTvContentView,
769                                TV_FRAMES_3_BLUE_START),
770                        SetupAnimationHelper.createFrameAnimatorWithDelay(mTvContentView,
771                                TV_FRAMES_3_BLUE_END, BLUE_SCREEN_HOLD_DURATION_MS),
772                        SetupAnimationHelper.createFrameAnimator(mArrowView,
773                                TV_FRAMES_3_ORANGE_ARROW),
774                        SetupAnimationHelper.createFrameAnimator(mTvContentView,
775                                TV_FRAMES_3_ORANGE_START));
776                animatorSet.addListener(new AnimatorListenerAdapter() {
777                    @Override
778                    public void onAnimationEnd(Animator animation) {
779                        mArrowView.setImageResource(TV_FRAMES_3_BLUE_ARROW[0]);
780                    }
781                });
782                firstFrame = TV_FRAMES_3_BLUE_START[0];
783                break;
784            case 3:
785            default:
786                animatorSet.playSequentially(hideAnimator,
787                        SetupAnimationHelper.createFrameAnimator(mTvContentView,
788                                TV_FRAMES_4_START));
789                firstFrame = TV_FRAMES_4_START[0];
790                break;
791        }
792        final int firstImageResource = firstFrame;
793        hideAnimator.addListener(new AnimatorListenerAdapter() {
794            @Override
795            public void onAnimationEnd(Animator animation) {
796                // Shows the first frame of show animation when the hide animator is canceled.
797                mTvContentView.setImageResource(firstImageResource);
798            }
799        });
800        mAnimator = SetupAnimationHelper.applyAnimationTimeScale(animatorSet);
801        mAnimator.start();
802    }
803}
804