/* * Copyright (c) 2012 Socialize Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.socialize.util; import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.util.DisplayMetrics; import com.socialize.R; import com.socialize.log.SocializeLogger; import java.io.InputStream; /** * Convenience class for getting drawables from raw images. * @author Jason Polites */ public class Drawables { private DisplayMetrics metrics = null; private ClassLoaderProvider classLoaderProvider; private DrawableCache cache; private BitmapUtils bitmapUtils; private SocializeLogger logger; private Resources resources; public Drawables() { super(); } public void init(Activity context) { metrics = new DisplayMetrics(); resources = context.getResources(); context.getWindowManager().getDefaultDisplay().getMetrics(metrics); } public Drawable getDrawable(String name) { return getDrawable(name, false, false, true); } public Drawable getDrawable(String name, boolean tileX, boolean tileY, boolean eternal) { String extra = ""; int hashIndex = name.indexOf('#'); if(hashIndex >= 0) { extra = name.substring(hashIndex, name.length()); name = name.substring(0, hashIndex); } int resourceId = getDrawableResourceId(name); if(resourceId > 0) { return getDrawable(resourceId, extra, tileX, tileY, eternal); } return null; } public Drawable getDrawable(int resourceId, String extra, boolean tileX, boolean tileY, boolean eternal) { return getDrawable(resourceId, extra, tileX, tileY, -1, -1, eternal); } public Drawable getDrawable(int resourceId, String extra) { return getDrawable(resourceId, extra, false, false, -1, -1, true); } public Drawable getDrawableFromUrl(String url, byte[] data, int scaleToWidth, int scaleToHeight) { CacheableDrawable drawable = cache.get(url); if(drawable == null) { Bitmap bitmap = bitmapUtils.getScaledBitmap ( data, scaleToWidth, scaleToHeight ); drawable = createDrawable(bitmap, url); addToCache(url, drawable, false); } return drawable; } private final int getDrawableResourceId(String name) { if(name.endsWith(".png")) { // Legacy name = name.substring(0, name.lastIndexOf(".")); } try { Class<?> drawable = R.drawable.class; Integer id = ReflectionUtils.getStaticField(name, drawable); if(id != null) { return id; } } catch (Exception e) { logger.error("Failed to find drawable with name " + name, e); } return -1; } public Drawable getDrawable(int resourceId, String extra, boolean tileX, boolean tileY, int scaleToWidth, int scaleToHeight, boolean eternal) { String key = String.valueOf(resourceId) + extra; CacheableDrawable drawable = cache.get(key); if(drawable != null && !drawable.isRecycled()) { return drawable; } Bitmap bmp = BitmapFactory.decodeResource(resources, resourceId); drawable = createDrawable(bmp, key); if(tileX) { drawable.setTileModeX(Shader.TileMode.REPEAT); } if(tileY) { drawable.setTileModeY(Shader.TileMode.REPEAT); } addToCache(key, drawable, eternal); return drawable; } public ClassLoaderProvider getClassLoaderProvider() { return classLoaderProvider; } public void setClassLoaderProvider(ClassLoaderProvider classLoaderProvider) { this.classLoaderProvider = classLoaderProvider; } public DrawableCache getCache() { return cache; } public void setCache(DrawableCache cache) { this.cache = cache; } public void setBitmapUtils(BitmapUtils bitmapUtils) { this.bitmapUtils = bitmapUtils; } public void setMetrics(DisplayMetrics metrics) { this.metrics = metrics; } public void setLogger(SocializeLogger logger) { this.logger = logger; } protected CacheableDrawable createDrawable(InputStream in, String name, boolean tileX, boolean tileY, int pixelsX, int pixelsY) { Bitmap bitmap = bitmapUtils.getScaledBitmap ( in, pixelsX, pixelsY, DisplayMetrics.DENSITY_DEFAULT); CacheableDrawable drawable = createDrawable(bitmap, name); if(tileX) { drawable.setTileModeX(Shader.TileMode.REPEAT); } if(tileY) { drawable.setTileModeY(Shader.TileMode.REPEAT); } return drawable; } protected CacheableDrawable createDrawable(Bitmap bitmap, String name) { return new CacheableDrawable(resources, bitmap, name); } protected void addToCache(String key, CacheableDrawable drawable, boolean eternal) { if(drawable != null) { cache.put(key, drawable, eternal); } } }