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.content.ActivityNotFoundException; 21 import android.content.Context; 22 import android.content.res.Resources; 23 import android.graphics.Bitmap; 24 import android.net.Uri; 25 import android.support.v17.leanback.widget.Presenter; 26 import android.text.TextUtils; 27 import android.util.Log; 28 import android.view.LayoutInflater; 29 import android.view.View; 30 import android.view.ViewGroup; 31 import android.view.ViewGroup.LayoutParams; 32 import android.widget.ImageView; 33 import android.widget.TextView; 34 35 import com.android.tv.settings.widget.BitmapDownloader; 36 import com.android.tv.settings.widget.BitmapDownloader.BitmapCallback; 37 import com.android.tv.settings.widget.BitmapWorkerOptions; 38 39 public class MenuItemPresenter extends Presenter { 40 41 private static final String TAG = "MenuItemPresenter"; 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 try { 96 v.getContext().startActivity(menuItem.getIntent()); 97 } catch (ActivityNotFoundException e) { 98 Log.e(TAG, "Activity not found", e); 99 } 100 } 101 } 102 }); 103 104 prepareImageView(menuItemViewHolder, menuItem.getImageUriGetter().getUri()); 105 } 106 } 107 108 @Override 109 public void onUnbindViewHolder(ViewHolder viewHolder) { 110 if (viewHolder instanceof MenuItemViewHolder) { 111 MenuItemViewHolder menuItemViewHolder = (MenuItemViewHolder) viewHolder; 112 menuItemViewHolder.mIconView.setImageBitmap(null); 113 BitmapDownloader.getInstance(viewHolder.view.getContext()).cancelDownload( 114 menuItemViewHolder.mBitmapCallBack); 115 } 116 } 117 118 private void prepareImageView(final MenuItemViewHolder menuItemViewHolder, String imageUri) { 119 menuItemViewHolder.mIconView.setVisibility(View.INVISIBLE); 120 LayoutParams lp = menuItemViewHolder.mIconView.getLayoutParams(); 121 if (imageUri != null) { 122 menuItemViewHolder.mBitmapCallBack = new BitmapCallback() { 123 @Override 124 public void onBitmapRetrieved(Bitmap bitmap) { 125 if (bitmap != null) { 126 menuItemViewHolder.mIconView.setImageBitmap(bitmap); 127 menuItemViewHolder.mIconView.setVisibility(View.VISIBLE); 128 menuItemViewHolder.mIconView.setAlpha(0f); 129 fadeIn(menuItemViewHolder.mIconView); 130 } 131 } 132 }; 133 134 Context context = menuItemViewHolder.view.getContext(); 135 136 BitmapWorkerOptions bitmapWorkerOptions = new BitmapWorkerOptions.Builder(context) 137 .resource(Uri.parse(imageUri)).height(lp.height).width(lp.width).build(); 138 139 BitmapDownloader.getInstance(context).getBitmap(bitmapWorkerOptions, 140 menuItemViewHolder.mBitmapCallBack); 141 } 142 } 143 144 private void fadeIn(View v) { 145 ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(v, "alpha", 1f); 146 alphaAnimator.setDuration(v.getContext().getResources().getInteger( 147 android.R.integer.config_shortAnimTime)); 148 alphaAnimator.start(); 149 } 150 151 private boolean prepareTextView(TextView textView, String title) { 152 boolean hasTextView = !TextUtils.isEmpty(title); 153 if (hasTextView) { 154 textView.setText(title); 155 textView.setVisibility(View.VISIBLE); 156 } else { 157 textView.setVisibility(View.GONE); 158 } 159 return hasTextView; 160 } 161 } 162