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
163103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.graphics.Paint;
173103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.graphics.Paint.FontMetricsInt;
183103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.graphics.PixelFormat;
193103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.graphics.drawable.Drawable;
20b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.os.Bundle;
21b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.support.v17.leanback.R;
22b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.text.TextUtils;
23b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.view.LayoutInflater;
24b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.view.View;
25b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.view.ViewGroup;
26b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.widget.Button;
27b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.widget.ImageView;
28b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stoutimport android.widget.TextView;
29b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
30b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout/**
31b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout * A fragment for displaying an error indication.
32b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout */
33a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gupublic class ErrorFragment extends BrandedFragment {
34b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
35a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu    private ViewGroup mErrorFrame;
36b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private ImageView mImageView;
37b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private TextView mTextView;
38b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private Button mButton;
39b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private Drawable mDrawable;
40b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private CharSequence mMessage;
41b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private String mButtonText;
42b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private View.OnClickListener mButtonClickListener;
43b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private Drawable mBackgroundDrawable;
44b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private boolean mIsBackgroundTranslucent = true;
45b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
46b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
47b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Sets the default background.
48b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
49b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param translucent True to set a translucent background.
50b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
51b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setDefaultBackground(boolean translucent) {
52b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mBackgroundDrawable = null;
53b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mIsBackgroundTranslucent = translucent;
54b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateBackground();
55b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateMessage();
56b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
57b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
58b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
59b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns true if the background is translucent.
60b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
61b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public boolean isBackgroundTranslucent() {
62b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mIsBackgroundTranslucent;
63b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
64b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
65b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
66b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Sets a drawable for the fragment background.
67b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
68b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param drawable The drawable used for the background.
69b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
70b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setBackgroundDrawable(Drawable drawable) {
71b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mBackgroundDrawable = drawable;
72b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        if (drawable != null) {
73b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            final int opacity = drawable.getOpacity();
743103f63e99d47573823957f7aa34308555873221Aurimas Liutikas            mIsBackgroundTranslucent = (opacity == PixelFormat.TRANSLUCENT
753103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    || opacity == PixelFormat.TRANSPARENT);
76b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        }
77b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateBackground();
78b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateMessage();
79b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
80b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
81b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
82b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns the background drawable.  May be null if a default is used.
83b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
84b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public Drawable getBackgroundDrawable() {
85b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mBackgroundDrawable;
86b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
87b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
88b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
89b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Sets the drawable to be used for the error image.
90b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
91b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param drawable The drawable used for the error image.
92b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
93b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setImageDrawable(Drawable drawable) {
94b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mDrawable = drawable;
95b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateImageDrawable();
96b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
97b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
98b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
99b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns the drawable used for the error image.
100b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
101b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public Drawable getImageDrawable() {
102b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mDrawable;
103b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
104b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
105b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
106b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Sets the error message.
107b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
108b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param message The error message.
109b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
110b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setMessage(CharSequence message) {
111b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mMessage = message;
112b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateMessage();
113b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
114b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
115b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
116b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns the error message.
117b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
118b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public CharSequence getMessage() {
119b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mMessage;
120b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
121b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
122b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
123b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Sets the button text.
124b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
125b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param text The button text.
126b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
127b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setButtonText(String text) {
128b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mButtonText = text;
129b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateButton();
130b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
131b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
132b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
133b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns the button text.
134b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
135b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public String getButtonText() {
136b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mButtonText;
137b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
138b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
139b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
140b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Set the button click listener.
141b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     *
142b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * @param clickListener The click listener for the button.
143b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
144b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void setButtonClickListener(View.OnClickListener clickListener) {
145b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mButtonClickListener = clickListener;
146b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateButton();
147b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
148b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
149b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    /**
150b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     * Returns the button click listener.
151b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout     */
152b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public View.OnClickListener getButtonClickListener() {
153b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return mButtonClickListener;
154b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
155b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
156b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    @Override
157b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public View onCreateView(LayoutInflater inflater, ViewGroup container,
158b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            Bundle savedInstanceState) {
159b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        View root = inflater.inflate(R.layout.lb_error_fragment, container, false);
160b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
161a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu        mErrorFrame = (ViewGroup) root.findViewById(R.id.error_frame);
162b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateBackground();
163b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
164a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu        installTitleView(inflater, mErrorFrame, savedInstanceState);
165a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu
166b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mImageView = (ImageView) root.findViewById(R.id.image);
167b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateImageDrawable();
168b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
169b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mTextView = (TextView) root.findViewById(R.id.message);
170b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateMessage();
171b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
172b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mButton = (Button) root.findViewById(R.id.button);
173b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        updateButton();
174b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
175b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        FontMetricsInt metrics = getFontMetricsInt(mTextView);
176b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        int underImageBaselineMargin = container.getResources().getDimensionPixelSize(
177b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                R.dimen.lb_error_under_image_baseline_margin);
178b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        setTopMargin(mTextView, underImageBaselineMargin + metrics.ascent);
179b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
180b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        int underMessageBaselineMargin = container.getResources().getDimensionPixelSize(
181b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                R.dimen.lb_error_under_message_baseline_margin);
182b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        setTopMargin(mButton, underMessageBaselineMargin - metrics.descent);
183b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
184b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return root;
185b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
186b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
187b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private void updateBackground() {
188b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        if (mErrorFrame != null) {
189b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            if (mBackgroundDrawable != null) {
190b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                mErrorFrame.setBackground(mBackgroundDrawable);
191b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            } else {
192b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout                mErrorFrame.setBackgroundColor(mErrorFrame.getResources().getColor(
1933103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        mIsBackgroundTranslucent
1943103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                                ? R.color.lb_error_background_color_translucent
1953103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                                : R.color.lb_error_background_color_opaque));
196b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            }
197b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        }
198b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
199b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
200b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private void updateMessage() {
201b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        if (mTextView != null) {
202b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mTextView.setText(mMessage);
203b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mTextView.setVisibility(TextUtils.isEmpty(mMessage) ? View.GONE : View.VISIBLE);
204b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        }
205b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
206b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
207b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private void updateImageDrawable() {
208b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        if (mImageView != null) {
209b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mImageView.setImageDrawable(mDrawable);
210b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mImageView.setVisibility(mDrawable == null ? View.GONE : View.VISIBLE);
211b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        }
212b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
213b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
214b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private void updateButton() {
215b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        if (mButton != null) {
216b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mButton.setText(mButtonText);
217b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mButton.setOnClickListener(mButtonClickListener);
218b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mButton.setVisibility(TextUtils.isEmpty(mButtonText) ? View.GONE : View.VISIBLE);
219b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout            mButton.requestFocus();
220b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        }
221b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
222b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
223b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    @Override
224b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    public void onStart() {
225b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        super.onStart();
226b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        mErrorFrame.requestFocus();
227b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
228b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
229b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private static FontMetricsInt getFontMetricsInt(TextView textView) {
230b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
231b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        paint.setTextSize(textView.getTextSize());
232b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        paint.setTypeface(textView.getTypeface());
233b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        return paint.getFontMetricsInt();
234b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
235b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout
236b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    private static void setTopMargin(TextView textView, int topMargin) {
237b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) textView.getLayoutParams();
238b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        lp.topMargin = topMargin;
239b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout        textView.setLayoutParams(lp);
240b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout    }
241a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu
242b7c2e023ab13ac158badfc9f4e17fd33fd6bf274Craig Stout}
243