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; 18 19 import android.animation.ObjectAnimator; 20 import android.app.Activity; 21 import android.content.Context; 22 import android.content.res.Resources; 23 import android.graphics.Bitmap; 24 import android.graphics.Paint; 25 import android.graphics.Paint.FontMetricsInt; 26 import android.graphics.Typeface; 27 import android.net.Uri; 28 import android.support.v17.leanback.widget.Presenter; 29 import android.text.TextUtils; 30 import android.view.LayoutInflater; 31 import android.view.View; 32 import android.view.ViewGroup; 33 import android.view.ViewGroup.LayoutParams; 34 import android.widget.ImageView; 35 import android.widget.TextView; 36 37 import com.android.tv.settings.widget.BitmapDownloader; 38 import com.android.tv.settings.widget.BitmapDownloader.BitmapCallback; 39 import com.android.tv.settings.widget.BitmapWorkerOptions; 40 41 public class MenuItemPresenter extends Presenter { 42 43 private static class MenuItemViewHolder extends ViewHolder { 44 public final ImageView mIconView; 45 public final TextView mTitleView; 46 public final TextView mDescriptionView; 47 public BitmapCallback mBitmapCallBack; 48 49 MenuItemViewHolder(View v) { 50 super(v); 51 mIconView = (ImageView) v.findViewById(R.id.icon); 52 mTitleView = (TextView) v.findViewById(R.id.title); 53 mDescriptionView = (TextView) v.findViewById(R.id.description); 54 } 55 56 } 57 58 @Override 59 public ViewHolder onCreateViewHolder(ViewGroup parent) { 60 LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService( 61 Context.LAYOUT_INFLATER_SERVICE); 62 View v = inflater.inflate(R.layout.browse_item, parent, false); 63 return new MenuItemViewHolder(v); 64 } 65 66 @Override 67 public void onBindViewHolder(ViewHolder viewHolder, Object item) { 68 if (item instanceof MenuItem && viewHolder instanceof MenuItemViewHolder) { 69 final MenuItem menuItem = (MenuItem) item; 70 MenuItemViewHolder menuItemViewHolder = (MenuItemViewHolder) viewHolder; 71 72 prepareTextView(menuItemViewHolder.mTitleView, menuItem.getTitle()); 73 boolean hasDescription = prepareTextView(menuItemViewHolder.mDescriptionView, 74 menuItem.getDescriptionGetter() == null ? null 75 : menuItem.getDescriptionGetter().getText()); 76 77 Resources res = menuItemViewHolder.mTitleView.getContext().getResources(); 78 ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) 79 menuItemViewHolder.mTitleView.getLayoutParams(); 80 if (hasDescription) { 81 lp.bottomMargin = (int) res.getDimension(R.dimen.browse_item_title_marginBottom); 82 menuItemViewHolder.mTitleView.setSingleLine(true); 83 menuItemViewHolder.mTitleView.setLines(1); 84 } else { 85 lp.bottomMargin = (int) res.getDimension(R.dimen.browse_item_description_marginBottom); 86 menuItemViewHolder.mTitleView.setSingleLine(false); 87 menuItemViewHolder.mTitleView.setLines(2); 88 } 89 menuItemViewHolder.mTitleView.setLayoutParams(lp); 90 91 viewHolder.view.setOnClickListener(new View.OnClickListener() { 92 @Override 93 public void onClick(View v) { 94 if (v != null && menuItem.getIntent() != null) { 95 ((Activity) v.getContext()).startActivity(menuItem.getIntent()); 96 } 97 } 98 }); 99 100 prepareImageView(menuItemViewHolder, menuItem.getImageUriGetter().getUri()); 101 } 102 } 103 104 @Override 105 public void onUnbindViewHolder(ViewHolder viewHolder) { 106 if (viewHolder instanceof MenuItemViewHolder) { 107 MenuItemViewHolder menuItemViewHolder = (MenuItemViewHolder) viewHolder; 108 menuItemViewHolder.mIconView.setImageBitmap(null); 109 BitmapDownloader.getInstance(viewHolder.view.getContext()).cancelDownload( 110 menuItemViewHolder.mBitmapCallBack); 111 } 112 } 113 114 private void prepareImageView(final MenuItemViewHolder menuItemViewHolder, String imageUri) { 115 menuItemViewHolder.mIconView.setVisibility(View.INVISIBLE); 116 LayoutParams lp = menuItemViewHolder.mIconView.getLayoutParams(); 117 if (imageUri != null) { 118 menuItemViewHolder.mBitmapCallBack = new BitmapCallback() { 119 @Override 120 public void onBitmapRetrieved(Bitmap bitmap) { 121 if (bitmap != null) { 122 menuItemViewHolder.mIconView.setImageBitmap(bitmap); 123 menuItemViewHolder.mIconView.setVisibility(View.VISIBLE); 124 menuItemViewHolder.mIconView.setAlpha(0f); 125 fadeIn(menuItemViewHolder.mIconView); 126 } 127 } 128 }; 129 130 Context context = menuItemViewHolder.view.getContext(); 131 132 BitmapWorkerOptions bitmapWorkerOptions = new BitmapWorkerOptions.Builder(context) 133 .resource(Uri.parse(imageUri)).height(lp.height).width(lp.width).build(); 134 135 BitmapDownloader.getInstance(context).getBitmap(bitmapWorkerOptions, 136 menuItemViewHolder.mBitmapCallBack); 137 } 138 } 139 140 private void fadeIn(View v) { 141 ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(v, "alpha", 1f); 142 alphaAnimator.setDuration(v.getContext().getResources().getInteger( 143 android.R.integer.config_shortAnimTime)); 144 alphaAnimator.start(); 145 } 146 147 private boolean prepareTextView(TextView textView, String title) { 148 boolean hasTextView = !TextUtils.isEmpty(title); 149 if (hasTextView) { 150 textView.setText(title); 151 textView.setVisibility(View.VISIBLE); 152 } else { 153 textView.setVisibility(View.GONE); 154 } 155 return hasTextView; 156 } 157 } 158