1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.tv.settings.dialog.old; 18 19 import android.animation.ObjectAnimator; 20 import android.app.Activity; 21 import android.content.Context; 22 import android.graphics.Bitmap; 23 import android.graphics.Color; 24 import android.graphics.drawable.Drawable; 25 import android.net.Uri; 26 import android.os.Bundle; 27 import android.view.LayoutInflater; 28 import android.view.View; 29 import android.view.ViewGroup; 30 import android.view.ViewGroup.LayoutParams; 31 import android.view.accessibility.AccessibilityManager; 32 import android.widget.ImageView; 33 import android.widget.RelativeLayout; 34 import android.widget.TextView; 35 36 import com.android.tv.settings.R; 37 import com.android.tv.settings.widget.FrameLayoutWithShadows; 38 39 /** 40 * This class exists to make extending both v4 fragments and regular fragments easy 41 */ 42 public class BaseContentFragment { 43 44 private static final String EXTRA_TITLE = "title"; 45 private static final String EXTRA_BREADCRUMB = "breadcrumb"; 46 private static final String EXTRA_DESCRIPTION = "description"; 47 private static final String EXTRA_ICON_RESOURCE_ID = "iconResourceId"; 48 private static final String EXTRA_ICON_URI = "iconUri"; 49 private static final String EXTRA_ICON_BITMAP = "iconBitmap"; 50 private static final String EXTRA_ICON_BACKGROUND = "iconBackground"; 51 buildArgs( String title, String breadcrumb, String description, int iconResourceId, int backgroundColor)52 public static Bundle buildArgs( 53 String title, String breadcrumb, String description, int iconResourceId, 54 int backgroundColor) { 55 return buildArgs(title, breadcrumb, description, iconResourceId, null, null, 56 backgroundColor); 57 } 58 buildArgs(String title, String breadcrumb, String description, Uri iconUri, int backgroundColor)59 public static Bundle buildArgs(String title, String breadcrumb, String description, Uri iconUri, 60 int backgroundColor) { 61 return buildArgs(title, breadcrumb, description, 0, iconUri, null, backgroundColor); 62 } 63 buildArgs(String title, String breadcrumb, String description, Bitmap iconBitmap)64 public static Bundle buildArgs(String title, String breadcrumb, String description, 65 Bitmap iconBitmap) { 66 return buildArgs(title, breadcrumb, description, 0, null, iconBitmap, Color.TRANSPARENT); 67 } 68 buildArgs( String title, String breadcrumb, String description, int iconResourceId, Uri iconUri, Bitmap iconBitmap, int iconBackgroundColor)69 private static Bundle buildArgs( 70 String title, String breadcrumb, String description, int iconResourceId, 71 Uri iconUri, Bitmap iconBitmap, int iconBackgroundColor) { 72 Bundle args = new Bundle(); 73 args.putString(EXTRA_TITLE, title); 74 args.putString(EXTRA_BREADCRUMB, breadcrumb); 75 args.putString(EXTRA_DESCRIPTION, description); 76 args.putInt(EXTRA_ICON_RESOURCE_ID, iconResourceId); 77 args.putParcelable(EXTRA_ICON_URI, iconUri); 78 args.putParcelable(EXTRA_ICON_BITMAP, iconBitmap); 79 args.putInt(EXTRA_ICON_BACKGROUND, iconBackgroundColor); 80 return args; 81 } 82 83 private final LiteFragment mFragment; 84 private Activity mActivity; 85 private String mTitle; 86 private String mBreadcrumb; 87 private String mDescription; 88 private int mIconResourceId; 89 private Bitmap mIconBitmap; 90 private int mIconBackgroundColor; 91 private AccessibilityManager mAccessManager; 92 BaseContentFragment(LiteFragment fragment)93 public BaseContentFragment(LiteFragment fragment) { 94 mFragment = fragment; 95 } 96 onCreate(Bundle savedInstanceState)97 public void onCreate(Bundle savedInstanceState) { 98 Bundle state = (savedInstanceState != null) ? savedInstanceState : mFragment.getArguments(); 99 if (mTitle == null) { 100 mTitle = state.getString(EXTRA_TITLE); 101 } 102 if (mBreadcrumb == null) { 103 mBreadcrumb = state.getString(EXTRA_BREADCRUMB); 104 } 105 if (mDescription == null) { 106 mDescription = state.getString(EXTRA_DESCRIPTION); 107 } 108 if (mIconResourceId == 0) { 109 mIconResourceId = state.getInt(EXTRA_ICON_RESOURCE_ID, 0); 110 } 111 if (mIconBitmap == null) { 112 mIconBitmap = state.getParcelable(EXTRA_ICON_BITMAP); 113 } 114 if (mIconBackgroundColor == Color.TRANSPARENT) { 115 mIconBackgroundColor = state.getInt(EXTRA_ICON_BACKGROUND, Color.TRANSPARENT); 116 } 117 } 118 onSaveInstanceState(Bundle outState)119 public void onSaveInstanceState(Bundle outState) { 120 outState.putString(EXTRA_TITLE, mTitle); 121 outState.putString(EXTRA_BREADCRUMB, mBreadcrumb); 122 outState.putString(EXTRA_DESCRIPTION, mDescription); 123 outState.putInt(EXTRA_ICON_RESOURCE_ID, mIconResourceId); 124 outState.putParcelable(EXTRA_ICON_BITMAP, mIconBitmap); 125 outState.putInt(EXTRA_ICON_BACKGROUND, mIconBackgroundColor); 126 } 127 128 /** 129 * Pass activity from ContentFragment to BaseContentFragment when it is 130 * attached. 131 */ onAttach(Activity activity)132 public void onAttach(Activity activity) { 133 mActivity = activity; 134 } 135 136 /** 137 * Rest BaseContentFragment mActivity to null when ContentFragment is 138 * detached. 139 */ onDetach()140 public void onDetach() { 141 mActivity = null; 142 } 143 onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)144 public View onCreateView( 145 LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 146 final View view = inflater.inflate(R.layout.content_fragment, container, false); 147 setText(view, R.id.title, mTitle); 148 setText(view, R.id.breadcrumb, mBreadcrumb); 149 setText(view, R.id.description, mDescription); 150 int iconResourceId = getIconResourceId(); 151 final ImageView iconImageView = (ImageView) view.findViewById(R.id.icon); 152 int iconBackground = getIconBackgroundColor(); 153 if (iconBackground != Color.TRANSPARENT) { 154 iconImageView.setBackgroundColor(iconBackground); 155 } 156 157 if (iconResourceId != 0) { 158 iconImageView.setImageResource(iconResourceId); 159 addShadow(iconImageView, view); 160 updateViewSize(iconImageView); 161 } else { 162 Bitmap iconBitmap = getIconBitmap(); 163 if (iconBitmap != null) { 164 iconImageView.setImageBitmap(iconBitmap); 165 addShadow(iconImageView, view); 166 updateViewSize(iconImageView); 167 } else { 168 iconImageView.setVisibility(View.GONE); 169 } 170 } 171 172 return view; 173 } 174 getIcon()175 public ImageView getIcon() { 176 if (mFragment.getView() == null) return null; 177 return (ImageView) mFragment.getView().findViewById(R.id.icon); 178 } 179 getTitle()180 public TextView getTitle() { 181 if (mFragment.getView() == null) return null; 182 return (TextView) mFragment.getView().findViewById(R.id.title); 183 } 184 getIconResourceId()185 public int getIconResourceId() { 186 return mIconResourceId; 187 } 188 getIconBitmap()189 public Bitmap getIconBitmap() { 190 return mIconBitmap; 191 } 192 getIconBackgroundColor()193 public int getIconBackgroundColor() { 194 return mIconBackgroundColor; 195 } 196 getRoot()197 public RelativeLayout getRoot() { 198 return (RelativeLayout) mFragment.getView(); 199 } 200 getBreadCrumb()201 public TextView getBreadCrumb() { 202 if (mFragment.getView() == null) return null; 203 return (TextView) mFragment.getView().findViewById(R.id.breadcrumb); 204 } 205 getDescription()206 public TextView getDescription() { 207 if (mFragment.getView() == null) return null; 208 return (TextView) mFragment.getView().findViewById(R.id.description); 209 } 210 setTextToExtra(View parent, int textViewResourceId, String extraLabel)211 public void setTextToExtra(View parent, int textViewResourceId, 212 String extraLabel) { 213 String text = mFragment.getArguments().getString(extraLabel, null); 214 setText(parent, textViewResourceId, text); 215 } 216 setTextToExtra(int textViewResourceId, String extraLabel)217 public void setTextToExtra(int textViewResourceId, String extraLabel) { 218 if (mFragment.getView() == null) return; 219 setTextToExtra(mFragment.getView(), textViewResourceId, extraLabel); 220 } 221 setText(View parent, int textViewResourceId, String text)222 public void setText(View parent, int textViewResourceId, String text) { 223 TextView textView = (TextView) parent.findViewById(textViewResourceId); 224 if (textView != null && text != null) { 225 textView.setText(text); 226 227 // Enable focusable title and description if accessibility is enabled. 228 if (mActivity != null) { 229 if (mAccessManager == null) { 230 mAccessManager = (AccessibilityManager) mActivity 231 .getSystemService(Context.ACCESSIBILITY_SERVICE); 232 } 233 if (mAccessManager.isEnabled()) { 234 textView.setFocusable(true); 235 textView.setFocusableInTouchMode(true); 236 } 237 } 238 } 239 } 240 setText(int textViewResourceId, String text)241 public void setText(int textViewResourceId, String text) { 242 if (mFragment.getView() == null) return; 243 setText(mFragment.getView(), textViewResourceId, text); 244 } 245 setTitleText(String text)246 public void setTitleText(String text) { 247 mTitle = text; 248 if (mFragment.getView() == null) return; 249 setText(mFragment.getView(), R.id.title, text); 250 } 251 setBreadCrumbText(String text)252 public void setBreadCrumbText(String text) { 253 mBreadcrumb = text; 254 if (mFragment.getView() == null) return; 255 setText(mFragment.getView(), R.id.breadcrumb, text); 256 } 257 setDescriptionText(String text)258 public void setDescriptionText(String text) { 259 mDescription = text; 260 if (mFragment.getView() == null) return; 261 setText(mFragment.getView(), R.id.description, text); 262 } 263 264 /** 265 * Unlike {@link #setIcon(int)}, this will only work if called 266 * after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. 267 * @param iconDrawable 268 */ setIcon(Drawable iconDrawable)269 public void setIcon(Drawable iconDrawable) { 270 if (mFragment.getView() == null) return; 271 272 final ImageView iconImageView = (ImageView) mFragment.getView().findViewById(R.id.icon); 273 if (iconImageView != null) { 274 if (iconDrawable != null) { 275 iconImageView.setImageDrawable(iconDrawable); 276 iconImageView.setVisibility(View.VISIBLE); 277 updateViewSize(iconImageView); 278 } 279 } 280 } 281 setIcon(int iconResourceId)282 public void setIcon(int iconResourceId) { 283 mIconResourceId = iconResourceId; 284 if (mFragment.getView() == null) return; 285 286 final ImageView iconImageView = (ImageView) mFragment.getView().findViewById(R.id.icon); 287 if (iconImageView != null) { 288 if (iconResourceId != 0) { 289 iconImageView.setImageResource(iconResourceId); 290 iconImageView.setVisibility(View.VISIBLE); 291 updateViewSize(iconImageView); 292 } 293 } 294 } 295 updateViewSize(ImageView iconView)296 private void updateViewSize(ImageView iconView) { 297 int intrinsicWidth = iconView.getDrawable().getIntrinsicWidth(); 298 LayoutParams lp = iconView.getLayoutParams(); 299 if (intrinsicWidth > 0) { 300 lp.height = lp.width * iconView.getDrawable().getIntrinsicHeight() 301 / intrinsicWidth; 302 } else { 303 // If no intrinsic width, then just mke this a square. 304 lp.height = lp.width; 305 } 306 } 307 addShadow(ImageView icon, View view)308 private void addShadow(ImageView icon, View view) { 309 FrameLayoutWithShadows shadowLayout = (FrameLayoutWithShadows) 310 view.findViewById(R.id.shadow_layout); 311 shadowLayout.addShadowView(icon); 312 } 313 fadeIn(View v)314 private void fadeIn(View v) { 315 v.setAlpha(0f); 316 ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(v, "alpha", 1f); 317 alphaAnimator.setDuration(mActivity.getResources().getInteger( 318 android.R.integer.config_mediumAnimTime)); 319 alphaAnimator.start(); 320 } 321 } 322