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