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