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