1b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout/*
2b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout * Copyright (C) 2014 The Android Open Source Project
3b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout *
4b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout * in compliance with the License. You may obtain a copy of the License at
6b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout *
7b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout * http://www.apache.org/licenses/LICENSE-2.0
8b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout *
9b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License
10b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout * or implied. See the License for the specific language governing permissions and limitations under
12b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout * the License.
13b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout */
14b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutpackage android.support.v17.leanback.app;
15b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
16b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.os.Bundle;
17b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.support.v17.leanback.R;
18b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.support.v17.leanback.widget.TitleView;
19b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.text.TextUtils;
20b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.util.Log;
21b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.app.Fragment;
22b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.view.LayoutInflater;
23b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.view.View;
24b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.view.View.OnClickListener;
25b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.view.ViewGroup;
26b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.widget.Button;
27b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.widget.ImageView;
28b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.widget.TextView;
29b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.graphics.Paint;
30b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.graphics.PixelFormat;
31b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.graphics.Paint.FontMetricsInt;
32b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.graphics.drawable.Drawable;
33b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
34b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout/**
35b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout * A fragment for displaying an error indication.
36b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout */
37a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gupublic class ErrorFragment extends BrandedFragment {
38b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
39a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu    private ViewGroup mErrorFrame;
40b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private ImageView mImageView;
41b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private TextView mTextView;
42b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private Button mButton;
43b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private Drawable mDrawable;
44b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private CharSequence mMessage;
45b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private String mButtonText;
46b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private View.OnClickListener mButtonClickListener;
47b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private Drawable mBackgroundDrawable;
48b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private boolean mIsBackgroundTranslucent = true;
49b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
50b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
51b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Sets the default background.
52b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
53b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param translucent True to set a translucent background.
54b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
55b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setDefaultBackground(boolean translucent) {
56b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mBackgroundDrawable = null;
57b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mIsBackgroundTranslucent = translucent;
58b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateBackground();
59b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateMessage();
60b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
61b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
62b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
63b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns true if the background is translucent.
64b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
65b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public boolean isBackgroundTranslucent() {
66b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mIsBackgroundTranslucent;
67b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
68b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
69b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
70b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Sets a drawable for the fragment background.
71b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
72b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param drawable The drawable used for the background.
73b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
74b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setBackgroundDrawable(Drawable drawable) {
75b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mBackgroundDrawable = drawable;
76b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        if (drawable != null) {
77b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            final int opacity = drawable.getOpacity();
78b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mIsBackgroundTranslucent = (opacity == PixelFormat.TRANSLUCENT ||
79b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                    opacity == PixelFormat.TRANSPARENT);
80b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        }
81b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateBackground();
82b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateMessage();
83b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
84b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
85b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
86b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns the background drawable.  May be null if a default is used.
87b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
88b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public Drawable getBackgroundDrawable() {
89b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mBackgroundDrawable;
90b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
91b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
92b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
93b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Sets the drawable to be used for the error image.
94b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
95b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param drawable The drawable used for the error image.
96b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
97b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setImageDrawable(Drawable drawable) {
98b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mDrawable = drawable;
99b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateImageDrawable();
100b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
101b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
102b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
103b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns the drawable used for the error image.
104b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
105b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public Drawable getImageDrawable() {
106b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mDrawable;
107b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
108b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
109b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
110b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Sets the error message.
111b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
112b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param message The error message.
113b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
114b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setMessage(CharSequence message) {
115b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mMessage = message;
116b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateMessage();
117b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
118b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
119b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
120b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns the error message.
121b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
122b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public CharSequence getMessage() {
123b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mMessage;
124b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
125b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
126b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
127b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Sets the button text.
128b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
129b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param text The button text.
130b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
131b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setButtonText(String text) {
132b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mButtonText = text;
133b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateButton();
134b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
135b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
136b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
137b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns the button text.
138b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
139b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public String getButtonText() {
140b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mButtonText;
141b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
142b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
143b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
144b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Set the button click listener.
145b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
146b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param clickListener The click listener for the button.
147b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
148b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setButtonClickListener(View.OnClickListener clickListener) {
149b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mButtonClickListener = clickListener;
150b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateButton();
151b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
152b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
153b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
154b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns the button click listener.
155b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
156b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public View.OnClickListener getButtonClickListener() {
157b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mButtonClickListener;
158b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
159b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
160b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    @Override
161b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public View onCreateView(LayoutInflater inflater, ViewGroup container,
162b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            Bundle savedInstanceState) {
163b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        View root = inflater.inflate(R.layout.lb_error_fragment, container, false);
164b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
165a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu        mErrorFrame = (ViewGroup) root.findViewById(R.id.error_frame);
166b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateBackground();
167b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
168a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu        installTitleView(inflater, mErrorFrame, savedInstanceState);
169a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu
170b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mImageView = (ImageView) root.findViewById(R.id.image);
171b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateImageDrawable();
172b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
173b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mTextView = (TextView) root.findViewById(R.id.message);
174b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateMessage();
175b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
176b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mButton = (Button) root.findViewById(R.id.button);
177b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateButton();
178b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
179b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        FontMetricsInt metrics = getFontMetricsInt(mTextView);
180b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        int underImageBaselineMargin = container.getResources().getDimensionPixelSize(
181b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                R.dimen.lb_error_under_image_baseline_margin);
182b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        setTopMargin(mTextView, underImageBaselineMargin + metrics.ascent);
183b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
184b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        int underMessageBaselineMargin = container.getResources().getDimensionPixelSize(
185b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                R.dimen.lb_error_under_message_baseline_margin);
186b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        setTopMargin(mButton, underMessageBaselineMargin - metrics.descent);
187b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
188b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return root;
189b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
190b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
191b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private void updateBackground() {
192b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        if (mErrorFrame != null) {
193b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            if (mBackgroundDrawable != null) {
194b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                mErrorFrame.setBackground(mBackgroundDrawable);
195b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            } else {
196b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                mErrorFrame.setBackgroundColor(mErrorFrame.getResources().getColor(
197b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                        mIsBackgroundTranslucent ?
198b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                        R.color.lb_error_background_color_translucent :
199b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                        R.color.lb_error_background_color_opaque));
200b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            }
201b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        }
202b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
203b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
204b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private void updateMessage() {
205b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        if (mTextView != null) {
206b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mTextView.setText(mMessage);
207b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mTextView.setVisibility(TextUtils.isEmpty(mMessage) ? View.GONE : View.VISIBLE);
208b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        }
209b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
210b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
211b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private void updateImageDrawable() {
212b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        if (mImageView != null) {
213b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mImageView.setImageDrawable(mDrawable);
214b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mImageView.setVisibility(mDrawable == null ? View.GONE : View.VISIBLE);
215b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        }
216b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
217b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
218b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private void updateButton() {
219b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        if (mButton != null) {
220b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mButton.setText(mButtonText);
221b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mButton.setOnClickListener(mButtonClickListener);
222b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mButton.setVisibility(TextUtils.isEmpty(mButtonText) ? View.GONE : View.VISIBLE);
223b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mButton.requestFocus();
224b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        }
225b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
226b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
227b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    @Override
228b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void onStart() {
229b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        super.onStart();
230b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mErrorFrame.requestFocus();
231b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
232b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
233b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private static FontMetricsInt getFontMetricsInt(TextView textView) {
234b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
235b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        paint.setTextSize(textView.getTextSize());
236b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        paint.setTypeface(textView.getTypeface());
237b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return paint.getFontMetricsInt();
238b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
239b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
240b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private static void setTopMargin(TextView textView, int topMargin) {
241b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) textView.getLayoutParams();
242b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        lp.topMargin = topMargin;
243b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        textView.setLayoutParams(lp);
244b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
245a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu
246b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout}
247