GuidanceStylist.java revision 4158705d3f0751d419a08c47a659abeae5f6c196
1ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing/*
2ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * Copyright (C) 2015 The Android Open Source Project
3ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing *
4ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * in compliance with the License. You may obtain a copy of the License at
6ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing *
7ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * http://www.apache.org/licenses/LICENSE-2.0
8ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing *
9ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * Unless required by applicable law or agreed to in writing, software distributed under the License
10ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * or implied. See the License for the specific language governing permissions and limitations under
12ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * the License.
13ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing */
14ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingpackage android.support.v17.leanback.widget;
15ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
16ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.animation.Animator;
17ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.animation.AnimatorInflater;
18ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.content.Context;
19ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.content.res.TypedArray;
20ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.graphics.drawable.Drawable;
21ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.support.annotation.NonNull;
22ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.support.v17.leanback.R;
23ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.util.TypedValue;
24ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.view.LayoutInflater;
25ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.view.View;
26ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.view.ViewGroup;
27ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.widget.ImageView;
28ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport android.widget.TextView;
29ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
30ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingimport java.util.List;
31ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
32ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing/**
33ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * GuidanceStylist is used within a {@link android.support.v17.leanback.app.GuidedStepFragment}
34ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * to display contextual information for the decision(s) required at that step.
35ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * <p>
36ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * Many aspects of the base GuidanceStylist can be customized through theming; see the theme
37ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * attributes below. Note that these attributes are not set on individual elements in layout
38ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * XML, but instead would be set in a custom theme. See
39ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * <a href="http://developer.android.com/guide/topics/ui/themes.html">Styles and Themes</a>
40ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * for more information.
41ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * <p>
42ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * If these hooks are insufficient, this class may also be subclassed. Subclasses
43ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * may wish to override the {@link #onProvideLayoutId} method to change the layout file used to
44ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * display the guidance; more complex layouts may be supported by also providing a subclass of
45ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * {@link GuidanceStylist.Guidance} with extra fields.
46ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * <p>
47ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * Note: If an alternate layout is provided, the following view IDs should be used to refer to base
48ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * elements:
49ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * <ul>
50ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * <li>{@link android.support.v17.leanback.R.id#guidance_title}</li>
51ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * <li>{@link android.support.v17.leanback.R.id#guidance_description}</li>
52ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * <li>{@link android.support.v17.leanback.R.id#guidance_breadcrumb}</li>
53ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * <li>{@link android.support.v17.leanback.R.id#guidance_icon}</li>
54ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * </ul><p>
55ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * View IDs are allowed to be missing, in which case the corresponding views will be null.
56ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing *
57ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidanceEntryAnimation
58ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepEntryAnimation
59ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepExitAnimation
60ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepReentryAnimation
61ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepReturnAnimation
624158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepImeAppearingAnimation
634158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepImeDisappearingAnimation
64ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidanceContainerStyle
65ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidanceTitleStyle
66ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidanceDescriptionStyle
67ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidanceBreadcrumbStyle
68ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidanceIconStyle
69ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @see android.support.v17.leanback.app.GuidedStepFragment
70ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing * @see GuidanceStylist.Guidance
71ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing */
72ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesingpublic class GuidanceStylist implements FragmentAnimationProvider {
73ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
74ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
75ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * A data class representing contextual information for a {@link
76ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * android.support.v17.leanback.app.GuidedStepFragment}. Guidance consists of a short title,
77ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * a longer description, a breadcrumb to help with global navigation (often indicating where
78ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * the back button will lead), and an optional icon.  All this information is intended to
79ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * provide users with the appropriate context to make the decision(s) required by the current
80ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * step.
81ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * <p>
82ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * Clients may provide a subclass of this if they wish to remember auxiliary data for use in
83ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * a customized GuidanceStylist.
84ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
85ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public static class Guidance {
86ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        private final String mTitle;
87ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        private final String mDescription;
88ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        private final String mBreadcrumb;
89ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        private final Drawable mIconDrawable;
90ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
91ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        /**
92ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * Constructs a Guidance object with the specified title, description, breadcrumb, and
93ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * icon drawable.
94ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * @param title The title for the current guided step.
95ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * @param description The description for the current guided step.
96ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * @param breadcrumb The breadcrumb for the current guided step.
97ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * @param icon The icon drawable representing the current guided step.
98ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         */
99ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        public Guidance(String title, String description, String breadcrumb, Drawable icon) {
100ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            mBreadcrumb = breadcrumb;
101ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            mTitle = title;
102ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            mDescription = description;
103ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            mIconDrawable = icon;
104ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        }
105ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
106ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        /**
107ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * Returns the title specified when this Guidance was constructed.
108ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * @return The title for this Guidance.
109ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         */
110ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        public String getTitle() {
111ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            return mTitle;
112ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        }
113ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
114ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        /**
115ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * Returns the description specified when this Guidance was constructed.
116ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * @return The description for this Guidance.
117ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         */
118ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        public String getDescription() {
119ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            return mDescription;
120ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        }
121ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
122ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        /**
123ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * Returns the breadcrumb specified when this Guidance was constructed.
124ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * @return The breadcrumb for this Guidance.
125ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         */
126ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        public String getBreadcrumb() {
127ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            return mBreadcrumb;
128ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        }
129ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
130ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        /**
131ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * Returns the icon drawable specified when this Guidance was constructed.
132ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         * @return The icon for this Guidance.
133ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing         */
134ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        public Drawable getIconDrawable() {
135ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            return mIconDrawable;
136ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        }
137ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
138ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
139ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    private TextView mTitleView;
140ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    private TextView mDescriptionView;
141ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    private TextView mBreadcrumbView;
142ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    private ImageView mIconView;
143ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
144ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
145ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * Creates an appropriately configured view for the given Guidance, using the provided
146ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * inflater and container.
147ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * <p>
148ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * <i>Note: Does not actually add the created view to the container; the caller should do
149ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * this.</i>
150ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * @param inflater The layout inflater to be used when constructing the view.
151ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * @param container The view group to be passed in the call to
152ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * <code>LayoutInflater.inflate</code>.
153ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * @param guidance The guidance data for the view.
154ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * @return The view to be added to the caller's view hierarchy.
155ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
156ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public View onCreateView(LayoutInflater inflater, ViewGroup container, Guidance guidance) {
157ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        View guidanceView = inflater.inflate(onProvideLayoutId(), container, false);
158ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        mTitleView = (TextView) guidanceView.findViewById(R.id.guidance_title);
159ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        mBreadcrumbView = (TextView) guidanceView.findViewById(R.id.guidance_breadcrumb);
160ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        mDescriptionView = (TextView) guidanceView.findViewById(R.id.guidance_description);
161ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        mIconView = (ImageView) guidanceView.findViewById(R.id.guidance_icon);
162ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
163ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        // We allow any of the cached subviews to be null, so that subclasses can choose not to
164ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        // display a particular piece of information.
165ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        if (mTitleView != null) {
166ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            mTitleView.setText(guidance.getTitle());
167ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        }
168ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        if (mBreadcrumbView != null) {
169ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            mBreadcrumbView.setText(guidance.getBreadcrumb());
170ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        }
171ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        if (mDescriptionView != null) {
172ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            mDescriptionView.setText(guidance.getDescription());
173ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        }
174ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        if (mIconView != null) {
175ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            mIconView.setImageDrawable(guidance.getIconDrawable());
176ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        }
177ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        return guidanceView;
178ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
179ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
180ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
181ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * Provides the resource ID of the layout defining the guidance view. Subclasses may override
182ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * to provide their own customized layouts. The base implementation returns
183ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * {@link android.support.v17.leanback.R.layout#lb_guidance}. If overridden, the substituted
184ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * layout should contain matching IDs for any views that should be managed by the base class;
185ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * this can be achieved by starting with a copy of the base layout file.
186ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * @return The resource ID of the layout to be inflated to define the guidance view.
187ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
188ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public int onProvideLayoutId() {
189ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        return R.layout.lb_guidance;
190ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
191ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
192ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
193ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * Returns the view displaying the title of the guidance.
194ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * @return The text view object for the title.
195ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
196ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public TextView getTitleView() {
197ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        return mTitleView;
198ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
199ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
200ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
201ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * Returns the view displaying the description of the guidance.
202ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * @return The text view object for the description.
203ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
204ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public TextView getDescriptionView() {
205ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        return mDescriptionView;
206ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
207ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
208ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
209ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * Returns the view displaying the breadcrumb of the guidance.
210ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * @return The text view object for the breadcrumb.
211ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
212ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public TextView getBreadcrumbView() {
213ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        return mBreadcrumbView;
214ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
215ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
216ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
217ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * Returns the view displaying the icon of the guidance.
218ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * @return The image view object for the icon.
219ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
220ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public ImageView getIconView() {
221ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        return mIconView;
222ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
223ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
224ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
225ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * {@inheritDoc}
226ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
227ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    @Override
228ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public void onActivityEnter(@NonNull List<Animator> animators) {
229ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mTitleView, R.attr.guidanceEntryAnimation);
230ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mBreadcrumbView, R.attr.guidanceEntryAnimation);
231ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mDescriptionView, R.attr.guidanceEntryAnimation);
232ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mIconView, R.attr.guidanceEntryAnimation);
233ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
234ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
235ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
236ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * {@inheritDoc}
237ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
238ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    @Override
239ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public void onActivityExit(@NonNull List<Animator> animators) {}
240ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
241ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
242ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * {@inheritDoc}
243ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
244ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    @Override
245ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public void onFragmentEnter(@NonNull List<Animator> animators) {
246ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mTitleView, R.attr.guidedStepEntryAnimation);
247ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mBreadcrumbView, R.attr.guidedStepEntryAnimation);
248ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mDescriptionView, R.attr.guidedStepEntryAnimation);
249ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mIconView, R.attr.guidedStepEntryAnimation);
250ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
251ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
252ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
253ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * {@inheritDoc}
254ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
255ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    @Override
256ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public void onFragmentExit(@NonNull List<Animator> animators) {
257ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mTitleView, R.attr.guidedStepExitAnimation);
258ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mBreadcrumbView, R.attr.guidedStepExitAnimation);
259ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mDescriptionView, R.attr.guidedStepExitAnimation);
260ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mIconView, R.attr.guidedStepExitAnimation);
261ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
262ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
263ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
264ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * {@inheritDoc}
265ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
266ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    @Override
267ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public void onFragmentReenter(@NonNull List<Animator> animators) {
268ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mTitleView, R.attr.guidedStepReentryAnimation);
269ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mBreadcrumbView, R.attr.guidedStepReentryAnimation);
270ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mDescriptionView, R.attr.guidedStepReentryAnimation);
271ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mIconView, R.attr.guidedStepReentryAnimation);
272ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
273ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
274ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    /**
275ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     * {@inheritDoc}
276ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing     */
277ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    @Override
278ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    public void onFragmentReturn(@NonNull List<Animator> animators) {
279ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mTitleView, R.attr.guidedStepReturnAnimation);
280ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mBreadcrumbView, R.attr.guidedStepReturnAnimation);
281ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mDescriptionView, R.attr.guidedStepReturnAnimation);
282ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        addAnimator(animators, mIconView, R.attr.guidedStepReturnAnimation);
283ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
284ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
2854158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing    /**
2864158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing     * {@inheritDoc}
2874158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing     */
2884158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing    @Override
2894158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing    public void onImeAppearing(@NonNull List<Animator> animators) {
2904158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing        addAnimator(animators, mTitleView, R.attr.guidedStepImeAppearingAnimation);
2914158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing        addAnimator(animators, mBreadcrumbView, R.attr.guidedStepImeAppearingAnimation);
2924158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing        addAnimator(animators, mDescriptionView, R.attr.guidedStepImeAppearingAnimation);
2934158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing        addAnimator(animators, mIconView, R.attr.guidedStepImeAppearingAnimation);
2944158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing    }
2954158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing
2964158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing    /**
2974158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing     * {@inheritDoc}
2984158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing     */
2994158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing    @Override
3004158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing    public void onImeDisappearing(@NonNull List<Animator> animators) {
3014158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing        addAnimator(animators, mTitleView, R.attr.guidedStepImeDisappearingAnimation);
3024158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing        addAnimator(animators, mBreadcrumbView, R.attr.guidedStepImeDisappearingAnimation);
3034158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing        addAnimator(animators, mDescriptionView, R.attr.guidedStepImeDisappearingAnimation);
3044158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing        addAnimator(animators, mIconView, R.attr.guidedStepImeDisappearingAnimation);
3054158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing    }
3064158705d3f0751d419a08c47a659abeae5f6c196Kris Giesing
307ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    private void addAnimator(List<Animator> animators, View v, int attrId) {
308ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        if (v != null) {
309ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            Context ctx = v.getContext();
310ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            TypedValue typedValue = new TypedValue();
311ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            ctx.getTheme().resolveAttribute(attrId, typedValue, true);
312ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            Animator animator = AnimatorInflater.loadAnimator(ctx, typedValue.resourceId);
313ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            animator.setTarget(v);
314ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing            animators.add(animator);
315ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing        }
316ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing    }
317ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing
318ebd3d9078dbaebd10a9506ca086435eb63e8a2d2Kris Giesing}
319