| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.tv.onboarding; |
| |
| import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS; |
| |
| import android.animation.Animator; |
| import android.animation.AnimatorInflater; |
| import android.animation.AnimatorListenerAdapter; |
| import android.animation.AnimatorSet; |
| import android.content.Context; |
| import android.os.Bundle; |
| import android.support.annotation.Nullable; |
| import androidx.leanback.app.OnboardingFragment; |
| import android.text.Editable; |
| import android.text.TextWatcher; |
| import android.view.Gravity; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.View.AccessibilityDelegate; |
| import android.view.ViewGroup; |
| import android.view.accessibility.AccessibilityEvent; |
| import android.view.accessibility.AccessibilityNodeInfo; |
| import android.widget.Button; |
| import android.widget.ImageView; |
| import android.widget.TextView; |
| import com.android.tv.R; |
| import com.android.tv.common.ui.setup.SetupActionHelper; |
| import com.android.tv.common.ui.setup.animation.SetupAnimationHelper; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** A fragment for the onboarding welcome screen. */ |
| public class WelcomeFragment extends OnboardingFragment { |
| public static final String ACTION_CATEGORY = "com.android.tv.onboarding.WelcomeFragment"; |
| public static final int ACTION_NEXT = 1; |
| |
| private static final long START_DELAY_CLOUD_MS = 33; |
| private static final long START_DELAY_TV_MS = 567; |
| private static final long START_DELAY_TV_CONTENTS_MS = 833; |
| private static final long START_DELAY_SHADOW_MS = 567; |
| |
| private static final long VIDEO_FADE_OUT_DURATION_MS = 333; |
| |
| private static final long BLUE_SCREEN_HOLD_DURATION_MS = 1500; |
| |
| // TODO: Use animator list xml. |
| private static final int[] TV_FRAMES_1_START = { |
| R.drawable.tv_1a_01, |
| R.drawable.tv_1a_02, |
| R.drawable.tv_1a_03, |
| R.drawable.tv_1a_04, |
| R.drawable.tv_1a_05, |
| R.drawable.tv_1a_06, |
| R.drawable.tv_1a_07, |
| R.drawable.tv_1a_08, |
| R.drawable.tv_1a_09, |
| R.drawable.tv_1a_10, |
| R.drawable.tv_1a_11, |
| R.drawable.tv_1a_12, |
| R.drawable.tv_1a_13, |
| R.drawable.tv_1a_14, |
| R.drawable.tv_1a_15, |
| R.drawable.tv_1a_16, |
| R.drawable.tv_1a_17, |
| R.drawable.tv_1a_18, |
| R.drawable.tv_1a_19, |
| R.drawable.tv_1a_20 |
| }; |
| |
| private static final int[] TV_FRAMES_1_END = { |
| R.drawable.tv_1b_01, |
| R.drawable.tv_1b_02, |
| R.drawable.tv_1b_03, |
| R.drawable.tv_1b_04, |
| R.drawable.tv_1b_05, |
| R.drawable.tv_1b_06, |
| R.drawable.tv_1b_07, |
| R.drawable.tv_1b_08, |
| R.drawable.tv_1b_09, |
| R.drawable.tv_1b_10, |
| R.drawable.tv_1b_11 |
| }; |
| |
| private static final int[] TV_FRAMES_2_START = { |
| R.drawable.tv_5a_0, |
| R.drawable.tv_5a_1, |
| R.drawable.tv_5a_2, |
| R.drawable.tv_5a_3, |
| R.drawable.tv_5a_4, |
| R.drawable.tv_5a_5, |
| R.drawable.tv_5a_6, |
| R.drawable.tv_5a_7, |
| R.drawable.tv_5a_8, |
| R.drawable.tv_5a_9, |
| R.drawable.tv_5a_10, |
| R.drawable.tv_5a_11, |
| R.drawable.tv_5a_12, |
| R.drawable.tv_5a_13, |
| R.drawable.tv_5a_14, |
| R.drawable.tv_5a_15, |
| R.drawable.tv_5a_16, |
| R.drawable.tv_5a_17, |
| R.drawable.tv_5a_18, |
| R.drawable.tv_5a_19, |
| R.drawable.tv_5a_20, |
| R.drawable.tv_5a_21, |
| R.drawable.tv_5a_22, |
| R.drawable.tv_5a_23, |
| R.drawable.tv_5a_24, |
| R.drawable.tv_5a_25, |
| R.drawable.tv_5a_26, |
| R.drawable.tv_5a_27, |
| R.drawable.tv_5a_28, |
| R.drawable.tv_5a_29, |
| R.drawable.tv_5a_30, |
| R.drawable.tv_5a_31, |
| R.drawable.tv_5a_32, |
| R.drawable.tv_5a_33, |
| R.drawable.tv_5a_34, |
| R.drawable.tv_5a_35, |
| R.drawable.tv_5a_36, |
| R.drawable.tv_5a_37, |
| R.drawable.tv_5a_38, |
| R.drawable.tv_5a_39, |
| R.drawable.tv_5a_40, |
| R.drawable.tv_5a_41, |
| R.drawable.tv_5a_42, |
| R.drawable.tv_5a_43, |
| R.drawable.tv_5a_44, |
| R.drawable.tv_5a_45, |
| R.drawable.tv_5a_46, |
| R.drawable.tv_5a_47, |
| R.drawable.tv_5a_48, |
| R.drawable.tv_5a_49, |
| R.drawable.tv_5a_50, |
| R.drawable.tv_5a_51, |
| R.drawable.tv_5a_52, |
| R.drawable.tv_5a_53, |
| R.drawable.tv_5a_54, |
| R.drawable.tv_5a_55, |
| R.drawable.tv_5a_56, |
| R.drawable.tv_5a_57, |
| R.drawable.tv_5a_58, |
| R.drawable.tv_5a_59, |
| R.drawable.tv_5a_60, |
| R.drawable.tv_5a_61, |
| R.drawable.tv_5a_62, |
| R.drawable.tv_5a_63, |
| R.drawable.tv_5a_64, |
| R.drawable.tv_5a_65, |
| R.drawable.tv_5a_66, |
| R.drawable.tv_5a_67, |
| R.drawable.tv_5a_68, |
| R.drawable.tv_5a_69, |
| R.drawable.tv_5a_70, |
| R.drawable.tv_5a_71, |
| R.drawable.tv_5a_72, |
| R.drawable.tv_5a_73, |
| R.drawable.tv_5a_74, |
| R.drawable.tv_5a_75, |
| R.drawable.tv_5a_76, |
| R.drawable.tv_5a_77, |
| R.drawable.tv_5a_78, |
| R.drawable.tv_5a_79, |
| R.drawable.tv_5a_80, |
| R.drawable.tv_5a_81, |
| R.drawable.tv_5a_82, |
| R.drawable.tv_5a_83, |
| R.drawable.tv_5a_84, |
| R.drawable.tv_5a_85, |
| R.drawable.tv_5a_86, |
| R.drawable.tv_5a_87, |
| R.drawable.tv_5a_88, |
| R.drawable.tv_5a_89, |
| R.drawable.tv_5a_90, |
| R.drawable.tv_5a_91, |
| R.drawable.tv_5a_92, |
| R.drawable.tv_5a_93, |
| R.drawable.tv_5a_94, |
| R.drawable.tv_5a_95, |
| R.drawable.tv_5a_96, |
| R.drawable.tv_5a_97, |
| R.drawable.tv_5a_98, |
| R.drawable.tv_5a_99, |
| R.drawable.tv_5a_100, |
| R.drawable.tv_5a_101, |
| R.drawable.tv_5a_102, |
| R.drawable.tv_5a_103, |
| R.drawable.tv_5a_104, |
| R.drawable.tv_5a_105, |
| R.drawable.tv_5a_106, |
| R.drawable.tv_5a_107, |
| R.drawable.tv_5a_108, |
| R.drawable.tv_5a_109, |
| R.drawable.tv_5a_110, |
| R.drawable.tv_5a_111, |
| R.drawable.tv_5a_112, |
| R.drawable.tv_5a_113, |
| R.drawable.tv_5a_114, |
| R.drawable.tv_5a_115, |
| R.drawable.tv_5a_116, |
| R.drawable.tv_5a_117, |
| R.drawable.tv_5a_118, |
| R.drawable.tv_5a_119, |
| R.drawable.tv_5a_120, |
| R.drawable.tv_5a_121, |
| R.drawable.tv_5a_122, |
| R.drawable.tv_5a_123, |
| R.drawable.tv_5a_124, |
| R.drawable.tv_5a_125, |
| R.drawable.tv_5a_126, |
| R.drawable.tv_5a_127, |
| R.drawable.tv_5a_128, |
| R.drawable.tv_5a_129, |
| R.drawable.tv_5a_130, |
| R.drawable.tv_5a_131, |
| R.drawable.tv_5a_132, |
| R.drawable.tv_5a_133, |
| R.drawable.tv_5a_134, |
| R.drawable.tv_5a_135, |
| R.drawable.tv_5a_136, |
| R.drawable.tv_5a_137, |
| R.drawable.tv_5a_138, |
| R.drawable.tv_5a_139, |
| R.drawable.tv_5a_140, |
| R.drawable.tv_5a_141, |
| R.drawable.tv_5a_142, |
| R.drawable.tv_5a_143, |
| R.drawable.tv_5a_144, |
| R.drawable.tv_5a_145, |
| R.drawable.tv_5a_146, |
| R.drawable.tv_5a_147, |
| R.drawable.tv_5a_148, |
| R.drawable.tv_5a_149, |
| R.drawable.tv_5a_150, |
| R.drawable.tv_5a_151, |
| R.drawable.tv_5a_152, |
| R.drawable.tv_5a_153, |
| R.drawable.tv_5a_154, |
| R.drawable.tv_5a_155, |
| R.drawable.tv_5a_156, |
| R.drawable.tv_5a_157, |
| R.drawable.tv_5a_158, |
| R.drawable.tv_5a_159, |
| R.drawable.tv_5a_160, |
| R.drawable.tv_5a_161, |
| R.drawable.tv_5a_162, |
| R.drawable.tv_5a_163, |
| R.drawable.tv_5a_164, |
| R.drawable.tv_5a_165, |
| R.drawable.tv_5a_166, |
| R.drawable.tv_5a_167, |
| R.drawable.tv_5a_168, |
| R.drawable.tv_5a_169, |
| R.drawable.tv_5a_170, |
| R.drawable.tv_5a_171, |
| R.drawable.tv_5a_172, |
| R.drawable.tv_5a_173, |
| R.drawable.tv_5a_174, |
| R.drawable.tv_5a_175, |
| R.drawable.tv_5a_176, |
| R.drawable.tv_5a_177, |
| R.drawable.tv_5a_178, |
| R.drawable.tv_5a_179, |
| R.drawable.tv_5a_180, |
| R.drawable.tv_5a_181, |
| R.drawable.tv_5a_182, |
| R.drawable.tv_5a_183, |
| R.drawable.tv_5a_184, |
| R.drawable.tv_5a_185, |
| R.drawable.tv_5a_186, |
| R.drawable.tv_5a_187, |
| R.drawable.tv_5a_188, |
| R.drawable.tv_5a_189, |
| R.drawable.tv_5a_190, |
| R.drawable.tv_5a_191, |
| R.drawable.tv_5a_192, |
| R.drawable.tv_5a_193, |
| R.drawable.tv_5a_194, |
| R.drawable.tv_5a_195, |
| R.drawable.tv_5a_196, |
| R.drawable.tv_5a_197, |
| R.drawable.tv_5a_198, |
| R.drawable.tv_5a_199, |
| R.drawable.tv_5a_200, |
| R.drawable.tv_5a_201, |
| R.drawable.tv_5a_202, |
| R.drawable.tv_5a_203, |
| R.drawable.tv_5a_204, |
| R.drawable.tv_5a_205, |
| R.drawable.tv_5a_206, |
| R.drawable.tv_5a_207, |
| R.drawable.tv_5a_208, |
| R.drawable.tv_5a_209, |
| R.drawable.tv_5a_210, |
| R.drawable.tv_5a_211, |
| R.drawable.tv_5a_212, |
| R.drawable.tv_5a_213, |
| R.drawable.tv_5a_214, |
| R.drawable.tv_5a_215, |
| R.drawable.tv_5a_216, |
| R.drawable.tv_5a_217, |
| R.drawable.tv_5a_218, |
| R.drawable.tv_5a_219, |
| R.drawable.tv_5a_220, |
| R.drawable.tv_5a_221, |
| R.drawable.tv_5a_222, |
| R.drawable.tv_5a_223, |
| R.drawable.tv_5a_224 |
| }; |
| |
| private static final int[] TV_FRAMES_3_BLUE_ARROW = { |
| R.drawable.arrow_blue_00, |
| R.drawable.arrow_blue_01, |
| R.drawable.arrow_blue_02, |
| R.drawable.arrow_blue_03, |
| R.drawable.arrow_blue_04, |
| R.drawable.arrow_blue_05, |
| R.drawable.arrow_blue_06, |
| R.drawable.arrow_blue_07, |
| R.drawable.arrow_blue_08, |
| R.drawable.arrow_blue_09, |
| R.drawable.arrow_blue_10, |
| R.drawable.arrow_blue_11, |
| R.drawable.arrow_blue_12, |
| R.drawable.arrow_blue_13, |
| R.drawable.arrow_blue_14, |
| R.drawable.arrow_blue_15, |
| R.drawable.arrow_blue_16, |
| R.drawable.arrow_blue_17, |
| R.drawable.arrow_blue_18, |
| R.drawable.arrow_blue_19, |
| R.drawable.arrow_blue_20, |
| R.drawable.arrow_blue_21, |
| R.drawable.arrow_blue_22, |
| R.drawable.arrow_blue_23, |
| R.drawable.arrow_blue_24, |
| R.drawable.arrow_blue_25, |
| R.drawable.arrow_blue_26, |
| R.drawable.arrow_blue_27, |
| R.drawable.arrow_blue_28, |
| R.drawable.arrow_blue_29, |
| R.drawable.arrow_blue_30, |
| R.drawable.arrow_blue_31, |
| R.drawable.arrow_blue_32, |
| R.drawable.arrow_blue_33, |
| R.drawable.arrow_blue_34, |
| R.drawable.arrow_blue_35, |
| R.drawable.arrow_blue_36, |
| R.drawable.arrow_blue_37, |
| R.drawable.arrow_blue_38, |
| R.drawable.arrow_blue_39, |
| R.drawable.arrow_blue_40, |
| R.drawable.arrow_blue_41, |
| R.drawable.arrow_blue_42, |
| R.drawable.arrow_blue_43, |
| R.drawable.arrow_blue_44, |
| R.drawable.arrow_blue_45, |
| R.drawable.arrow_blue_46, |
| R.drawable.arrow_blue_47, |
| R.drawable.arrow_blue_48, |
| R.drawable.arrow_blue_49, |
| R.drawable.arrow_blue_50, |
| R.drawable.arrow_blue_51, |
| R.drawable.arrow_blue_52, |
| R.drawable.arrow_blue_53, |
| R.drawable.arrow_blue_54, |
| R.drawable.arrow_blue_55, |
| R.drawable.arrow_blue_56, |
| R.drawable.arrow_blue_57, |
| R.drawable.arrow_blue_58, |
| R.drawable.arrow_blue_59, |
| R.drawable.arrow_blue_60 |
| }; |
| |
| private static final int[] TV_FRAMES_3_BLUE_START = { |
| R.drawable.tv_2a_01, |
| R.drawable.tv_2a_02, |
| R.drawable.tv_2a_03, |
| R.drawable.tv_2a_04, |
| R.drawable.tv_2a_05, |
| R.drawable.tv_2a_06, |
| R.drawable.tv_2a_07, |
| R.drawable.tv_2a_08, |
| R.drawable.tv_2a_09, |
| R.drawable.tv_2a_10, |
| R.drawable.tv_2a_11, |
| R.drawable.tv_2a_12, |
| R.drawable.tv_2a_13, |
| R.drawable.tv_2a_14, |
| R.drawable.tv_2a_15, |
| R.drawable.tv_2a_16, |
| R.drawable.tv_2a_17, |
| R.drawable.tv_2a_18, |
| R.drawable.tv_2a_19 |
| }; |
| |
| private static final int[] TV_FRAMES_3_BLUE_END = { |
| R.drawable.tv_2b_01, |
| R.drawable.tv_2b_02, |
| R.drawable.tv_2b_03, |
| R.drawable.tv_2b_04, |
| R.drawable.tv_2b_05, |
| R.drawable.tv_2b_06, |
| R.drawable.tv_2b_07, |
| R.drawable.tv_2b_08, |
| R.drawable.tv_2b_09, |
| R.drawable.tv_2b_10, |
| R.drawable.tv_2b_11, |
| R.drawable.tv_2b_12, |
| R.drawable.tv_2b_13, |
| R.drawable.tv_2b_14, |
| R.drawable.tv_2b_15, |
| R.drawable.tv_2b_16, |
| R.drawable.tv_2b_17, |
| R.drawable.tv_2b_18, |
| R.drawable.tv_2b_19 |
| }; |
| |
| private static final int[] TV_FRAMES_3_ORANGE_ARROW = { |
| R.drawable.arrow_orange_180, |
| R.drawable.arrow_orange_181, |
| R.drawable.arrow_orange_182, |
| R.drawable.arrow_orange_183, |
| R.drawable.arrow_orange_184, |
| R.drawable.arrow_orange_185, |
| R.drawable.arrow_orange_186, |
| R.drawable.arrow_orange_187, |
| R.drawable.arrow_orange_188, |
| R.drawable.arrow_orange_189, |
| R.drawable.arrow_orange_190, |
| R.drawable.arrow_orange_191, |
| R.drawable.arrow_orange_192, |
| R.drawable.arrow_orange_193, |
| R.drawable.arrow_orange_194, |
| R.drawable.arrow_orange_195, |
| R.drawable.arrow_orange_196, |
| R.drawable.arrow_orange_197, |
| R.drawable.arrow_orange_198, |
| R.drawable.arrow_orange_199, |
| R.drawable.arrow_orange_200, |
| R.drawable.arrow_orange_201, |
| R.drawable.arrow_orange_202, |
| R.drawable.arrow_orange_203, |
| R.drawable.arrow_orange_204, |
| R.drawable.arrow_orange_205, |
| R.drawable.arrow_orange_206, |
| R.drawable.arrow_orange_207, |
| R.drawable.arrow_orange_208, |
| R.drawable.arrow_orange_209, |
| R.drawable.arrow_orange_210, |
| R.drawable.arrow_orange_211, |
| R.drawable.arrow_orange_212, |
| R.drawable.arrow_orange_213, |
| R.drawable.arrow_orange_214, |
| R.drawable.arrow_orange_215, |
| R.drawable.arrow_orange_216, |
| R.drawable.arrow_orange_217, |
| R.drawable.arrow_orange_218, |
| R.drawable.arrow_orange_219, |
| R.drawable.arrow_orange_220, |
| R.drawable.arrow_orange_221, |
| R.drawable.arrow_orange_222, |
| R.drawable.arrow_orange_223, |
| R.drawable.arrow_orange_224, |
| R.drawable.arrow_orange_225, |
| R.drawable.arrow_orange_226, |
| R.drawable.arrow_orange_227, |
| R.drawable.arrow_orange_228, |
| R.drawable.arrow_orange_229, |
| R.drawable.arrow_orange_230, |
| R.drawable.arrow_orange_231, |
| R.drawable.arrow_orange_232, |
| R.drawable.arrow_orange_233, |
| R.drawable.arrow_orange_234, |
| R.drawable.arrow_orange_235, |
| R.drawable.arrow_orange_236, |
| R.drawable.arrow_orange_237, |
| R.drawable.arrow_orange_238, |
| R.drawable.arrow_orange_239, |
| R.drawable.arrow_orange_240 |
| }; |
| |
| private static final int[] TV_FRAMES_3_ORANGE_START = { |
| R.drawable.tv_2c_01, |
| R.drawable.tv_2c_02, |
| R.drawable.tv_2c_03, |
| R.drawable.tv_2c_04, |
| R.drawable.tv_2c_05, |
| R.drawable.tv_2c_06, |
| R.drawable.tv_2c_07, |
| R.drawable.tv_2c_08, |
| R.drawable.tv_2c_09, |
| R.drawable.tv_2c_10, |
| R.drawable.tv_2c_11, |
| R.drawable.tv_2c_12, |
| R.drawable.tv_2c_13, |
| R.drawable.tv_2c_14, |
| R.drawable.tv_2c_15, |
| R.drawable.tv_2c_16 |
| }; |
| |
| private static final int[] TV_FRAMES_4_START = { |
| R.drawable.tv_3a_01, |
| R.drawable.tv_3a_02, |
| R.drawable.tv_3a_03, |
| R.drawable.tv_3a_04, |
| R.drawable.tv_3a_05, |
| R.drawable.tv_3a_06, |
| R.drawable.tv_3a_07, |
| R.drawable.tv_3a_08, |
| R.drawable.tv_3a_09, |
| R.drawable.tv_3a_10, |
| R.drawable.tv_3a_11, |
| R.drawable.tv_3a_12, |
| R.drawable.tv_3a_13, |
| R.drawable.tv_3a_14, |
| R.drawable.tv_3a_15, |
| R.drawable.tv_3a_16, |
| R.drawable.tv_3a_17, |
| R.drawable.tv_3b_75, |
| R.drawable.tv_3b_76, |
| R.drawable.tv_3b_77, |
| R.drawable.tv_3b_78, |
| R.drawable.tv_3b_79, |
| R.drawable.tv_3b_80, |
| R.drawable.tv_3b_81, |
| R.drawable.tv_3b_82, |
| R.drawable.tv_3b_83, |
| R.drawable.tv_3b_84, |
| R.drawable.tv_3b_85, |
| R.drawable.tv_3b_86, |
| R.drawable.tv_3b_87, |
| R.drawable.tv_3b_88, |
| R.drawable.tv_3b_89, |
| R.drawable.tv_3b_90, |
| R.drawable.tv_3b_91, |
| R.drawable.tv_3b_92, |
| R.drawable.tv_3b_93, |
| R.drawable.tv_3b_94, |
| R.drawable.tv_3b_95, |
| R.drawable.tv_3b_96, |
| R.drawable.tv_3b_97, |
| R.drawable.tv_3b_98, |
| R.drawable.tv_3b_99, |
| R.drawable.tv_3b_100, |
| R.drawable.tv_3b_101, |
| R.drawable.tv_3b_102, |
| R.drawable.tv_3b_103, |
| R.drawable.tv_3b_104, |
| R.drawable.tv_3b_105, |
| R.drawable.tv_3b_106, |
| R.drawable.tv_3b_107, |
| R.drawable.tv_3b_108, |
| R.drawable.tv_3b_109, |
| R.drawable.tv_3b_110, |
| R.drawable.tv_3b_111, |
| R.drawable.tv_3b_112, |
| R.drawable.tv_3b_113, |
| R.drawable.tv_3b_114, |
| R.drawable.tv_3b_115, |
| R.drawable.tv_3b_116, |
| R.drawable.tv_3b_117, |
| R.drawable.tv_3b_118 |
| }; |
| |
| private String[] mPageTitles; |
| private String[] mPageDescriptions; |
| |
| private ImageView mTvContentView; |
| private ImageView mArrowView; |
| |
| private TextView mTitleView; |
| private Button mStartButton; |
| private View mPagingIndicator; |
| |
| private Animator mAnimator; |
| |
| private boolean mLogoAnimationFinished; |
| private boolean mTitleChanged; |
| |
| public WelcomeFragment() { |
| setExitTransition( |
| new SetupAnimationHelper.TransitionBuilder() |
| .setSlideEdge(Gravity.START) |
| .setParentIdsForDelay(new int[] {R.id.onboarding_fragment_root}) |
| .build()); |
| } |
| |
| @Override |
| public void onAttach(Context context) { |
| super.onAttach(context); |
| initialize(); |
| } |
| |
| private void initialize() { |
| if (mPageTitles == null) { |
| mPageTitles = getResources().getStringArray(R.array.welcome_page_titles); |
| mPageDescriptions = getResources().getStringArray(R.array.welcome_page_descriptions); |
| } |
| } |
| |
| @Nullable |
| @Override |
| public View onCreateView( |
| LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { |
| View view = super.onCreateView(inflater, container, savedInstanceState); |
| setLogoResourceId(R.drawable.splash_logo); |
| mTitleView = view.findViewById(androidx.leanback.R.id.title); |
| mPagingIndicator = view.findViewById(androidx.leanback.R.id.page_indicator); |
| mStartButton = view.findViewById(androidx.leanback.R.id.button_start); |
| |
| mStartButton.setAccessibilityDelegate( |
| new AccessibilityDelegate() { |
| @Override |
| public void onInitializeAccessibilityEvent( |
| View host, AccessibilityEvent event) { |
| int type = event.getEventType(); |
| if (type == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED |
| || type == AccessibilityEvent.TYPE_VIEW_FOCUSED) { |
| if (!mTitleChanged || mTitleView.isAccessibilityFocused()) { |
| // Skip the event before the title is accessibility focused to avoid |
| // race |
| // conditions |
| return; |
| } |
| } |
| super.onInitializeAccessibilityEvent(host, event); |
| } |
| }); |
| |
| mPagingIndicator.setAccessibilityDelegate( |
| new AccessibilityDelegate() { |
| @Override |
| public void onInitializeAccessibilityEvent( |
| View host, AccessibilityEvent event) { |
| int type = event.getEventType(); |
| if (type == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED |
| || type == AccessibilityEvent.TYPE_VIEW_FOCUSED) { |
| if (!mTitleChanged || mTitleView.isAccessibilityFocused()) { |
| // Skip the event before the title is accessibility focused to avoid |
| // race |
| // conditions |
| return; |
| } |
| } |
| super.onInitializeAccessibilityEvent(host, event); |
| } |
| }); |
| |
| mTitleView.setAccessibilityDelegate( |
| new AccessibilityDelegate() { |
| @Override |
| public boolean performAccessibilityAction(View host, int action, Bundle args) { |
| if (action == ACTION_CLEAR_ACCESSIBILITY_FOCUS) { |
| if (!mTitleChanged || mTitleView.isAccessibilityFocused()) { |
| // Skip the event before the title is accessibility focused to avoid |
| // race |
| // conditions |
| return false; |
| } |
| } |
| return super.performAccessibilityAction(host, action, args); |
| } |
| }); |
| |
| mTitleView.addTextChangedListener( |
| new TextWatcher() { |
| @Override |
| public void beforeTextChanged(CharSequence s, int start, int count, int after) { |
| mTitleChanged = false; |
| } |
| |
| @Override |
| public void onTextChanged(CharSequence s, int start, int before, int count) {} |
| |
| @Override |
| public void afterTextChanged(Editable s) { |
| if (!mTitleView.isAccessibilityFocused()) { |
| mTitleView.performAccessibilityAction( |
| AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null); |
| } else { |
| mTitleView.sendAccessibilityEvent( |
| AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); |
| } |
| mTitleChanged = true; |
| } |
| }); |
| return view; |
| } |
| |
| @Override |
| public void onViewCreated(View view, Bundle savedInstanceState) { |
| super.onViewCreated(view, savedInstanceState); |
| if (savedInstanceState != null && mLogoAnimationFinished) { |
| switch (getCurrentPageIndex()) { |
| case 0: |
| mTvContentView.setImageResource( |
| TV_FRAMES_1_START[TV_FRAMES_1_START.length - 1]); |
| break; |
| case 1: |
| mTvContentView.setImageResource( |
| TV_FRAMES_2_START[TV_FRAMES_2_START.length - 1]); |
| break; |
| case 2: |
| mTvContentView.setImageResource( |
| TV_FRAMES_3_ORANGE_START[TV_FRAMES_3_ORANGE_START.length - 1]); |
| mArrowView.setImageResource(TV_FRAMES_3_BLUE_ARROW[0]); |
| break; |
| case 3: |
| default: |
| mTvContentView.setImageResource( |
| TV_FRAMES_4_START[TV_FRAMES_4_START.length - 1]); |
| break; |
| } |
| } |
| } |
| |
| @Override |
| public int onProvideTheme() { |
| return R.style.Theme_Leanback_Onboarding; |
| } |
| |
| @Override |
| protected void onLogoAnimationFinished() { |
| super.onLogoAnimationFinished(); |
| mLogoAnimationFinished = true; |
| } |
| |
| @Override |
| protected Animator onCreateEnterAnimation() { |
| List<Animator> animators = new ArrayList<>(); |
| // Cloud 1 |
| View view = getActivity().findViewById(R.id.cloud1); |
| view.setAlpha(0); |
| Animator animator = |
| AnimatorInflater.loadAnimator( |
| getActivity(), R.animator.onboarding_welcome_cloud_enter); |
| animator.setStartDelay(START_DELAY_CLOUD_MS); |
| animator.setTarget(view); |
| animators.add(animator); |
| // Cloud 2 |
| view = getActivity().findViewById(R.id.cloud2); |
| view.setAlpha(0); |
| animator = |
| AnimatorInflater.loadAnimator( |
| getActivity(), R.animator.onboarding_welcome_cloud_enter); |
| animator.setStartDelay(START_DELAY_CLOUD_MS); |
| animator.setTarget(view); |
| animators.add(animator); |
| // TV container |
| view = getActivity().findViewById(R.id.tv_container); |
| view.setAlpha(0); |
| animator = |
| AnimatorInflater.loadAnimator( |
| getActivity(), R.animator.onboarding_welcome_tv_enter); |
| animator.setStartDelay(START_DELAY_TV_MS); |
| animator.setTarget(view); |
| animators.add(animator); |
| // TV content |
| view = getActivity().findViewById(R.id.tv_content); |
| animator = SetupAnimationHelper.createFrameAnimator((ImageView) view, TV_FRAMES_1_START); |
| animator.setStartDelay(START_DELAY_TV_CONTENTS_MS); |
| animator.setTarget(view); |
| animators.add(animator); |
| // Shadow |
| view = getActivity().findViewById(R.id.shadow); |
| view.setAlpha(0); |
| animator = |
| AnimatorInflater.loadAnimator( |
| getActivity(), R.animator.onboarding_welcome_shadow_enter); |
| animator.setStartDelay(START_DELAY_SHADOW_MS); |
| animator.setTarget(view); |
| animators.add(animator); |
| AnimatorSet set = new AnimatorSet(); |
| set.playTogether(animators); |
| return set; |
| } |
| |
| @Nullable |
| @Override |
| protected View onCreateBackgroundView(LayoutInflater inflater, ViewGroup container) { |
| return inflater.inflate(R.layout.onboarding_welcome_background, container, false); |
| } |
| |
| @Nullable |
| @Override |
| protected View onCreateContentView(LayoutInflater inflater, ViewGroup container) { |
| View view = inflater.inflate(R.layout.onboarding_welcome_content, container, false); |
| mTvContentView = (ImageView) view.findViewById(R.id.tv_content); |
| return view; |
| } |
| |
| @Nullable |
| @Override |
| protected View onCreateForegroundView(LayoutInflater inflater, ViewGroup container) { |
| mArrowView = |
| (ImageView) |
| inflater.inflate(R.layout.onboarding_welcome_foreground, container, false); |
| return mArrowView; |
| } |
| |
| @Override |
| protected int getPageCount() { |
| return mPageTitles.length; |
| } |
| |
| @Override |
| protected String getPageTitle(int pageIndex) { |
| return mPageTitles[pageIndex]; |
| } |
| |
| @Override |
| protected String getPageDescription(int pageIndex) { |
| return mPageDescriptions[pageIndex]; |
| } |
| |
| @Override |
| protected void onFinishFragment() { |
| SetupActionHelper.onActionClick(WelcomeFragment.this, ACTION_CATEGORY, ACTION_NEXT); |
| } |
| |
| @Override |
| protected void onPageChanged(int newPage, int previousPage) { |
| if (mAnimator != null) { |
| mAnimator.cancel(); |
| } |
| mTitleChanged = false; |
| mArrowView.setVisibility(View.GONE); |
| // TV screen hiding animator. |
| Animator hideAnimator = |
| previousPage == 0 |
| ? SetupAnimationHelper.createFrameAnimator(mTvContentView, TV_FRAMES_1_END) |
| : SetupAnimationHelper.createFadeOutAnimator( |
| mTvContentView, VIDEO_FADE_OUT_DURATION_MS, true); |
| // TV screen showing animator. |
| AnimatorSet animatorSet = new AnimatorSet(); |
| int firstFrame; |
| switch (newPage) { |
| case 0: |
| animatorSet.playSequentially( |
| hideAnimator, |
| SetupAnimationHelper.createFrameAnimator( |
| mTvContentView, TV_FRAMES_1_START)); |
| firstFrame = TV_FRAMES_1_START[0]; |
| break; |
| case 1: |
| animatorSet.playSequentially( |
| hideAnimator, |
| SetupAnimationHelper.createFrameAnimator( |
| mTvContentView, TV_FRAMES_2_START)); |
| firstFrame = TV_FRAMES_2_START[0]; |
| break; |
| case 2: |
| mArrowView.setVisibility(View.VISIBLE); |
| animatorSet.playSequentially( |
| hideAnimator, |
| SetupAnimationHelper.createFrameAnimator( |
| mArrowView, TV_FRAMES_3_BLUE_ARROW), |
| SetupAnimationHelper.createFrameAnimator( |
| mTvContentView, TV_FRAMES_3_BLUE_START), |
| SetupAnimationHelper.createFrameAnimatorWithDelay( |
| mTvContentView, TV_FRAMES_3_BLUE_END, BLUE_SCREEN_HOLD_DURATION_MS), |
| SetupAnimationHelper.createFrameAnimator( |
| mArrowView, TV_FRAMES_3_ORANGE_ARROW), |
| SetupAnimationHelper.createFrameAnimator( |
| mTvContentView, TV_FRAMES_3_ORANGE_START)); |
| animatorSet.addListener( |
| new AnimatorListenerAdapter() { |
| @Override |
| public void onAnimationEnd(Animator animation) { |
| mArrowView.setImageResource(TV_FRAMES_3_BLUE_ARROW[0]); |
| } |
| }); |
| firstFrame = TV_FRAMES_3_BLUE_START[0]; |
| break; |
| case 3: |
| default: |
| animatorSet.playSequentially( |
| hideAnimator, |
| SetupAnimationHelper.createFrameAnimator( |
| mTvContentView, TV_FRAMES_4_START)); |
| firstFrame = TV_FRAMES_4_START[0]; |
| break; |
| } |
| final int firstImageResource = firstFrame; |
| hideAnimator.addListener( |
| new AnimatorListenerAdapter() { |
| @Override |
| public void onAnimationEnd(Animator animation) { |
| // Shows the first frame of show animation when the hide animator is |
| // canceled. |
| mTvContentView.setImageResource(firstImageResource); |
| } |
| }); |
| mAnimator = SetupAnimationHelper.applyAnimationTimeScale(animatorSet); |
| mAnimator.start(); |
| } |
| } |