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 
MenuItemViewHolder(View v)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
onCreateViewHolder(ViewGroup parent)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
onBindViewHolder(ViewHolder viewHolder, Object item)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
onUnbindViewHolder(ViewHolder viewHolder)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 
prepareImageView(final MenuItemViewHolder menuItemViewHolder, String imageUri)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 
fadeIn(View v)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 
prepareTextView(TextView textView, String title)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