TitleView.java revision a373804d10f93a9488adc35cf6ce44dce09b3778
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 */
14package android.support.v17.leanback.widget;
15
16import android.content.Context;
17import android.graphics.drawable.Drawable;
18import android.support.v17.leanback.R;
19import android.util.AttributeSet;
20import android.view.LayoutInflater;
21import android.view.View;
22import android.widget.FrameLayout;
23import android.widget.ImageView;
24import android.widget.TextView;
25
26import static android.support.v17.leanback.widget.TitleViewAdapter.BRANDING_VIEW_VISIBLE;
27import static android.support.v17.leanback.widget.TitleViewAdapter.SEARCH_VIEW_VISIBLE;
28import static android.support.v17.leanback.widget.TitleViewAdapter.FULL_VIEW_VISIBLE;
29
30/**
31 * Title view for a leanback fragment.
32 */
33public class TitleView extends FrameLayout implements TitleViewAdapter.Provider {
34
35    private ImageView mBadgeView;
36    private TextView mTextView;
37    private SearchOrbView mSearchOrbView;
38    private int flags = FULL_VIEW_VISIBLE;
39
40    private final TitleViewAdapter mTitleViewAdapter = new TitleViewAdapter() {
41        @Override
42        public View getSearchAffordanceView() {
43            return TitleView.this.getSearchAffordanceView();
44        }
45
46        @Override
47        public void setOnSearchClickedListener(View.OnClickListener listener) {
48            TitleView.this.setOnSearchClickedListener(listener);
49        }
50
51        @Override
52        public void setAnimationEnabled(boolean enable) {
53            TitleView.this.enableAnimation(enable);
54        }
55
56        @Override
57        public Drawable getBadgeDrawable() {
58            return TitleView.this.getBadgeDrawable();
59        }
60
61        @Override
62        public SearchOrbView.Colors getSearchAffordanceColors() {
63            return TitleView.this.getSearchAffordanceColors();
64        }
65
66        @Override
67        public CharSequence getTitle() {
68            return TitleView.this.getTitle();
69        }
70
71        @Override
72        public void setBadgeDrawable(Drawable drawable) {
73            TitleView.this.setBadgeDrawable(drawable);
74        }
75
76        @Override
77        public void setSearchAffordanceColors(SearchOrbView.Colors colors) {
78            TitleView.this.setSearchAffordanceColors(colors);
79        }
80
81        @Override
82        public void setTitle(CharSequence titleText) {
83            TitleView.this.setTitle(titleText);
84        }
85
86        @Override
87        public void updateComponentsVisibility(int flags) {
88            TitleView.this.updateComponentsVisibility(flags);
89        }
90    };
91
92    public TitleView(Context context) {
93        this(context, null);
94    }
95
96    public TitleView(Context context, AttributeSet attrs) {
97        this(context, attrs, R.attr.browseTitleViewStyle);
98    }
99
100    public TitleView(Context context, AttributeSet attrs, int defStyleAttr) {
101        super(context, attrs, defStyleAttr);
102
103        LayoutInflater inflater = LayoutInflater.from(context);
104        View rootView = inflater.inflate(R.layout.lb_title_view, this);
105
106        mBadgeView = (ImageView) rootView.findViewById(R.id.title_badge);
107        mTextView = (TextView) rootView.findViewById(R.id.title_text);
108        mSearchOrbView = (SearchOrbView) rootView.findViewById(R.id.title_orb);
109
110        setClipToPadding(false);
111        setClipChildren(false);
112    }
113
114    /**
115     * Sets the title text.
116     */
117    public void setTitle(CharSequence titleText) {
118        mTextView.setText(titleText);
119        updateBadgeVisibility();
120    }
121
122    /**
123     * Returns the title text.
124     */
125    public CharSequence getTitle() {
126        return mTextView.getText();
127    }
128
129    /**
130     * Sets the badge drawable.
131     * If non-null, the drawable is displayed instead of the title text.
132     */
133    public void setBadgeDrawable(Drawable drawable) {
134        mBadgeView.setImageDrawable(drawable);
135        updateBadgeVisibility();
136    }
137
138    /**
139     * Returns the badge drawable.
140     */
141    public Drawable getBadgeDrawable() {
142        return mBadgeView.getDrawable();
143    }
144
145    /**
146     * Sets the listener to be called when the search affordance is clicked.
147     */
148    public void setOnSearchClickedListener(View.OnClickListener listener) {
149        mSearchOrbView.setOnOrbClickedListener(listener);
150    }
151
152    /**
153     *  Returns the view for the search affordance.
154     */
155    public View getSearchAffordanceView() {
156        return mSearchOrbView;
157    }
158
159    /**
160     * Sets the {@link SearchOrbView.Colors} used to draw the search affordance.
161     */
162    public void setSearchAffordanceColors(SearchOrbView.Colors colors) {
163        mSearchOrbView.setOrbColors(colors);
164    }
165
166    /**
167     * Returns the {@link SearchOrbView.Colors} used to draw the search affordance.
168     */
169    public SearchOrbView.Colors getSearchAffordanceColors() {
170        return mSearchOrbView.getOrbColors();
171    }
172
173    /**
174     * Enables or disables any view animations.
175     */
176    public void enableAnimation(boolean enable) {
177        mSearchOrbView.enableOrbColorAnimation(enable && mSearchOrbView.hasFocus());
178    }
179
180    /**
181     * Based on the flag, it updates the visibility of the individual components -
182     * BadgeView, TextView and SearchView.
183     *
184     * @param flags integer representing the visibility of TitleView components.
185     * @see TitleViewAdapter#SEARCH_VIEW_VISIBLE
186     * @see TitleViewAdapter#BRANDING_VIEW_VISIBLE
187     * @see TitleViewAdapter#FULL_VIEW_VISIBLE
188     */
189    public void updateComponentsVisibility(int flags) {
190        this.flags = flags;
191
192        if ((flags & BRANDING_VIEW_VISIBLE) == BRANDING_VIEW_VISIBLE) {
193            updateBadgeVisibility();
194        } else {
195            mBadgeView.setVisibility(View.GONE);
196            mTextView.setVisibility(View.GONE);
197        }
198
199        int visibility = (flags & SEARCH_VIEW_VISIBLE) == SEARCH_VIEW_VISIBLE
200                ? View.VISIBLE : View.INVISIBLE;
201        mSearchOrbView.setVisibility(visibility);
202    }
203
204    private void updateBadgeVisibility() {
205        Drawable drawable = mBadgeView.getDrawable();
206        if (drawable != null) {
207            mBadgeView.setVisibility(View.VISIBLE);
208            mTextView.setVisibility(View.GONE);
209        } else {
210            mBadgeView.setVisibility(View.GONE);
211            mTextView.setVisibility(View.VISIBLE);
212        }
213    }
214
215    @Override
216    public TitleViewAdapter getTitleViewAdapter() {
217        return mTitleViewAdapter;
218    }
219}
220