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