BitmapWorkerOptions.java revision 65a5a7d84ad9b5324ae53eda526e39e513473af7
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
17package com.android.tv.settings.widget;
18
19import android.content.Context;
20import android.content.Intent.ShortcutIconResource;
21import android.graphics.Bitmap;
22import android.net.Uri;
23import android.text.TextUtils;
24
25import 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 */
33public 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 Context mContext;
66        private int mCacheFlag;
67        private Bitmap.Config mBitmapConfig;
68
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
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
105        public Builder resource(String packageName, String resourceName) {
106            mPackageName = packageName;
107            mResourceName = resourceName;
108            return this;
109        }
110
111        public Builder resource(ShortcutIconResource iconResource) {
112            mPackageName = iconResource.packageName;
113            mResourceName = iconResource.resourceName;
114            return this;
115        }
116
117        public Builder resource(Uri resourceUri) {
118            mResourceUri = resourceUri;
119            return this;
120        }
121
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
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
140        public Builder cacheFlag(int flag) {
141            mCacheFlag = flag;
142            return this;
143        }
144
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     */
157    private BitmapWorkerOptions() {
158    }
159
160    public ShortcutIconResource getIconResource() {
161        return mIconResource;
162    }
163
164    public Uri getResourceUri() {
165        return mResourceUri;
166    }
167
168    public int getWidth() {
169        return mWidth;
170    }
171
172    public int getHeight() {
173        return mHeight;
174    }
175
176    public Context getContext() {
177        return mContext;
178    }
179
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     */
190    public int getCacheFlag() {
191        return mCacheFlag;
192    }
193
194    public boolean isMemCacheEnabled() {
195        return (mCacheFlag & CACHE_FLAG_MEM_DISABLED) == 0;
196    }
197
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     */
206    public Bitmap.Config getBitmapConfig() {
207        return mBitmapConfig;
208    }
209
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
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