1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14 package com.example.android.leanback; 15 16 import android.animation.Animator; 17 import android.animation.AnimatorListenerAdapter; 18 import android.animation.AnimatorSet; 19 import android.animation.ObjectAnimator; 20 import android.graphics.drawable.AnimationDrawable; 21 import android.view.LayoutInflater; 22 import android.view.View; 23 import android.view.ViewGroup; 24 import android.widget.ImageView; 25 26 import androidx.leanback.app.OnboardingFragment; 27 28 import org.jspecify.annotations.NonNull; 29 import org.jspecify.annotations.Nullable; 30 31 import java.util.ArrayList; 32 33 public class OnboardingDemoFragment extends OnboardingFragment { 34 private static final long ANIMATION_DURATION = 1000; 35 36 private static final int[] CONTENT_BACKGROUNDS = { 37 R.drawable.tv_bg, 38 R.drawable.gallery_photo_6, 39 R.drawable.gallery_photo_8 40 }; 41 42 private static final int[] CONTENT_ANIMATIONS = { 43 R.drawable.tv_content, 44 android.R.drawable.stat_sys_download, 45 android.R.drawable.ic_popup_sync 46 }; 47 48 private String[] mTitles; 49 private String[] mDescriptions; 50 51 private View mBackgroundView; 52 private View mContentView; 53 private ImageView mContentBackgroundView; 54 private ImageView mContentAnimationView; 55 56 private Animator mContentAnimator; 57 58 @SuppressWarnings("deprecation") 59 @Override onAttach(android.app.Activity activity)60 public void onAttach(android.app.Activity activity) { 61 super.onAttach(activity); 62 mTitles = getResources().getStringArray(R.array.onboarding_page_titles); 63 mDescriptions = getResources().getStringArray(R.array.onboarding_page_descriptions); 64 setLogoResourceId(R.drawable.ic_launcher); 65 } 66 67 @Override getPageCount()68 protected int getPageCount() { 69 return mTitles.length; 70 } 71 72 @Override getPageTitle(int i)73 protected CharSequence getPageTitle(int i) { 74 return mTitles[i]; 75 } 76 77 @Override getPageDescription(int i)78 protected CharSequence getPageDescription(int i) { 79 return mDescriptions[i]; 80 } 81 82 @Override onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup)83 protected View onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) { 84 mBackgroundView = layoutInflater.inflate(R.layout.onboarding_image, viewGroup, false); 85 return mBackgroundView; 86 } 87 88 @Override onCreateContentView(@onNull LayoutInflater layoutInflater, @NonNull ViewGroup viewGroup)89 protected @Nullable View onCreateContentView(@NonNull LayoutInflater layoutInflater, 90 @NonNull ViewGroup viewGroup) { 91 mContentView = layoutInflater.inflate(R.layout.onboarding_content, viewGroup, false); 92 mContentBackgroundView = (ImageView) mContentView.findViewById(R.id.background_image); 93 mContentAnimationView = (ImageView) mContentView.findViewById(R.id.animation_image); 94 return mContentView; 95 } 96 97 @Override onCreateForegroundView(@onNull LayoutInflater layoutInflater, @NonNull ViewGroup viewGroup)98 protected @Nullable View onCreateForegroundView(@NonNull LayoutInflater layoutInflater, 99 @NonNull ViewGroup viewGroup) { 100 return null; 101 } 102 103 @Override onCreateEnterAnimation()104 protected Animator onCreateEnterAnimation() { 105 ArrayList<Animator> animators = new ArrayList<>(); 106 animators.add(createFadeInAnimator(mBackgroundView)); 107 mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[0]); 108 mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[0]); 109 mContentAnimator = createFadeInAnimator(mContentView); 110 animators.add(mContentAnimator); 111 AnimatorSet set = new AnimatorSet(); 112 set.playTogether(animators); 113 set.addListener(new AnimatorListenerAdapter() { 114 @Override 115 public void onAnimationEnd(Animator animation) { 116 ((AnimationDrawable) mContentAnimationView.getDrawable()).start(); 117 } 118 }); 119 return set; 120 } 121 122 @Override onPageChanged(final int newPage, int previousPage)123 protected void onPageChanged(final int newPage, int previousPage) { 124 if (mContentAnimator != null) { 125 mContentAnimator.cancel(); 126 } 127 ((AnimationDrawable) mContentAnimationView.getDrawable()).stop(); 128 Animator fadeOut = createFadeOutAnimator(mContentView); 129 fadeOut.addListener(new AnimatorListenerAdapter() { 130 @Override 131 public void onAnimationEnd(Animator animation) { 132 mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[newPage]); 133 mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[newPage]); 134 } 135 }); 136 Animator fadeIn = createFadeInAnimator(mContentView); 137 fadeIn.addListener(new AnimatorListenerAdapter() { 138 @Override 139 public void onAnimationEnd(Animator animation) { 140 ((AnimationDrawable) mContentAnimationView.getDrawable()).start(); 141 } 142 }); 143 AnimatorSet set = new AnimatorSet(); 144 set.playSequentially(fadeOut, fadeIn); 145 set.start(); 146 mContentAnimator = set; 147 } 148 createFadeInAnimator(View view)149 private Animator createFadeInAnimator(View view) { 150 return ObjectAnimator.ofFloat(view, View.ALPHA, 0.0f, 1.0f).setDuration(ANIMATION_DURATION); 151 } 152 createFadeOutAnimator(View view)153 private Animator createFadeOutAnimator(View view) { 154 return ObjectAnimator.ofFloat(view, View.ALPHA, 1.0f, 0.0f).setDuration(ANIMATION_DURATION); 155 } 156 157 @Override onFinishFragment()158 protected void onFinishFragment() { 159 getActivity().finish(); 160 } 161 } 162