• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.widget;
18 
19 import android.content.Context;
20 import android.content.Intent.ShortcutIconResource;
21 import android.graphics.Bitmap;
22 import android.net.Uri;
23 import android.text.TextUtils;
24 
25 import com.android.tv.settings.util.UriUtils;
26 
27 /**
28  * Options for loading bitmap resources from different sources and for scaling to an appropriate
29  * resolution.
30  *
31  * @see BitmapWorkerTask
32  */
33 public class BitmapWorkerOptions {
34 
35     /** Max image size handled by android.graphics */
36     static final int MAX_IMAGE_DIMENSION_PX = 2048;
37 
38     /** flag to force disable memory cache */
39     public static final int CACHE_FLAG_MEM_DISABLED = 1;
40     /** TODO support disk cache options */
41     public static final int CACHE_FLAG_DISK_DISABLED = 2;
42 
43     private ShortcutIconResource mIconResource;
44     private Uri mResourceUri;
45 
46     private int mWidth;
47     private int mHeight;
48     private Context mContext;
49     private int mCacheFlag;
50     private Bitmap.Config mBitmapConfig;
51 
52     private String mKey;
53 
54     /**
55      * Builds options for a bitmap worker task.
56      */
57     public static class Builder {
58 
59         private String mPackageName;
60         private String mResourceName;
61         private Uri mResourceUri;
62 
63         private int mWidth;
64         private int mHeight;
65         private final Context mContext;
66         private int mCacheFlag;
67         private Bitmap.Config mBitmapConfig;
68 
Builder(Context context)69         public Builder(Context context) {
70             mWidth = MAX_IMAGE_DIMENSION_PX;
71             mHeight = MAX_IMAGE_DIMENSION_PX;
72             mContext = context.getApplicationContext();
73             mCacheFlag = 0;
74             mBitmapConfig = null;
75         }
76 
build()77         public BitmapWorkerOptions build() {
78             BitmapWorkerOptions options = new BitmapWorkerOptions();
79 
80             if (!TextUtils.isEmpty(mPackageName)) {
81                 options.mIconResource = new ShortcutIconResource();
82                 options.mIconResource.packageName = mPackageName;
83                 options.mIconResource.resourceName = mResourceName;
84             }
85 
86             final int largestDim = Math.max(mWidth, mHeight);
87             if (largestDim > MAX_IMAGE_DIMENSION_PX) {
88                 double scale = (double) MAX_IMAGE_DIMENSION_PX / largestDim;
89                 mWidth *= scale;
90                 mHeight *= scale;
91             }
92 
93             options.mResourceUri = mResourceUri;
94             options.mWidth = mWidth;
95             options.mHeight = mHeight;
96             options.mContext = mContext;
97             options.mCacheFlag = mCacheFlag;
98             options.mBitmapConfig = mBitmapConfig;
99             if (options.mIconResource == null && options.mResourceUri == null) {
100                 throw new RuntimeException("Both Icon and ResourceUri are null");
101             }
102             return options;
103         }
104 
resource(String packageName, String resourceName)105         public Builder resource(String packageName, String resourceName) {
106             mPackageName = packageName;
107             mResourceName = resourceName;
108             return this;
109         }
110 
resource(ShortcutIconResource iconResource)111         public Builder resource(ShortcutIconResource iconResource) {
112             mPackageName = iconResource.packageName;
113             mResourceName = iconResource.resourceName;
114             return this;
115         }
116 
resource(Uri resourceUri)117         public Builder resource(Uri resourceUri) {
118             mResourceUri = resourceUri;
119             return this;
120         }
121 
width(int width)122         public Builder width(int width) {
123             if (width > 0) {
124                 mWidth = width;
125             } else {
126                 throw new IllegalArgumentException("Can't set width to " + width);
127             }
128             return this;
129         }
130 
height(int height)131         public Builder height(int height) {
132             if (height > 0) {
133                 mHeight = height;
134             } else {
135                 throw new IllegalArgumentException("Can't set height to " + height);
136             }
137             return this;
138         }
139 
cacheFlag(int flag)140         public Builder cacheFlag(int flag) {
141             mCacheFlag = flag;
142             return this;
143         }
144 
bitmapConfig(Bitmap.Config config)145         public Builder bitmapConfig(Bitmap.Config config) {
146             mBitmapConfig = config;
147             return this;
148         }
149 
150     }
151 
152     /**
153      * Private constructor.
154      * <p>
155      * Use a {@link Builder} to create.
156      */
BitmapWorkerOptions()157     private BitmapWorkerOptions() {
158     }
159 
getIconResource()160     public ShortcutIconResource getIconResource() {
161         return mIconResource;
162     }
163 
getResourceUri()164     public Uri getResourceUri() {
165         return mResourceUri;
166     }
167 
getWidth()168     public int getWidth() {
169         return mWidth;
170     }
171 
getHeight()172     public int getHeight() {
173         return mHeight;
174     }
175 
getContext()176     public Context getContext() {
177         return mContext;
178     }
179 
isFromResource()180     public boolean isFromResource() {
181         return getIconResource() != null ||
182                 UriUtils.isAndroidResourceUri(getResourceUri())
183                 || UriUtils.isShortcutIconResourceUri(getResourceUri());
184     }
185 
186     /**
187      * Combination of CACHE_FLAG_MEM_DISABLED and CACHE_FLAG_DISK_DISABLED,
188      * 0 for fully cache enabled
189      */
getCacheFlag()190     public int getCacheFlag() {
191         return mCacheFlag;
192     }
193 
isMemCacheEnabled()194     public boolean isMemCacheEnabled() {
195         return (mCacheFlag & CACHE_FLAG_MEM_DISABLED) == 0;
196     }
197 
isDiskCacheEnabled()198     public boolean isDiskCacheEnabled() {
199         return (mCacheFlag & CACHE_FLAG_DISK_DISABLED) == 0;
200     }
201 
202     /**
203      * @return  preferred Bitmap config to decode bitmap, null for auto detect.
204      * Use {@link Builder#bitmapConfig(android.graphics.Bitmap.Config)} to change it.
205      */
getBitmapConfig()206     public Bitmap.Config getBitmapConfig() {
207         return mBitmapConfig;
208     }
209 
getCacheKey()210     public String getCacheKey() {
211         if (mKey == null) {
212             mKey = mIconResource != null ? mIconResource.packageName + "/"
213                     + mIconResource.resourceName : mResourceUri.toString();
214         }
215         return mKey;
216     }
217 
218     @Override
toString()219     public String toString() {
220         if (mIconResource == null) {
221             return "URI: " + mResourceUri;
222         } else {
223             return "PackageName: " + mIconResource.packageName + " Resource: " + mIconResource
224                     + " URI: " + mResourceUri;
225         }
226     }
227 }
228