19038afb70d70650d87659bb252181ca8645670b8Chris Craik/* 29038afb70d70650d87659bb252181ca8645670b8Chris Craik * Copyright (C) 2014 The Android Open Source Project 39038afb70d70650d87659bb252181ca8645670b8Chris Craik * 49038afb70d70650d87659bb252181ca8645670b8Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 59038afb70d70650d87659bb252181ca8645670b8Chris Craik * you may not use this file except in compliance with the License. 69038afb70d70650d87659bb252181ca8645670b8Chris Craik * You may obtain a copy of the License at 79038afb70d70650d87659bb252181ca8645670b8Chris Craik * 89038afb70d70650d87659bb252181ca8645670b8Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 99038afb70d70650d87659bb252181ca8645670b8Chris Craik * 109038afb70d70650d87659bb252181ca8645670b8Chris Craik * Unless required by applicable law or agreed to in writing, software 119038afb70d70650d87659bb252181ca8645670b8Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 129038afb70d70650d87659bb252181ca8645670b8Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139038afb70d70650d87659bb252181ca8645670b8Chris Craik * See the License for the specific language governing permissions and 149038afb70d70650d87659bb252181ca8645670b8Chris Craik * limitations under the License. 159038afb70d70650d87659bb252181ca8645670b8Chris Craik */ 169038afb70d70650d87659bb252181ca8645670b8Chris Craik 179038afb70d70650d87659bb252181ca8645670b8Chris Craikpackage android.support.v4.graphics.drawable; 189038afb70d70650d87659bb252181ca8645670b8Chris Craik 199038afb70d70650d87659bb252181ca8645670b8Chris Craikimport android.content.res.Resources; 209038afb70d70650d87659bb252181ca8645670b8Chris Craikimport android.graphics.Bitmap; 219038afb70d70650d87659bb252181ca8645670b8Chris Craikimport android.graphics.BitmapFactory; 229038afb70d70650d87659bb252181ca8645670b8Chris Craikimport android.graphics.Rect; 239038afb70d70650d87659bb252181ca8645670b8Chris Craikimport android.os.Build; 249038afb70d70650d87659bb252181ca8645670b8Chris Craikimport android.support.v4.graphics.BitmapCompat; 259038afb70d70650d87659bb252181ca8645670b8Chris Craikimport android.support.v4.view.GravityCompat; 269038afb70d70650d87659bb252181ca8645670b8Chris Craikimport android.support.v4.view.ViewCompat; 279038afb70d70650d87659bb252181ca8645670b8Chris Craikimport android.util.Log; 289038afb70d70650d87659bb252181ca8645670b8Chris Craik 299038afb70d70650d87659bb252181ca8645670b8Chris Craik/** 309038afb70d70650d87659bb252181ca8645670b8Chris Craik * Constructs {@link RoundedBitmapDrawable RoundedBitmapDrawable} objects, 319038afb70d70650d87659bb252181ca8645670b8Chris Craik * either from Bitmaps directly, or from streams and files. 329038afb70d70650d87659bb252181ca8645670b8Chris Craik */ 33c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banespublic final class RoundedBitmapDrawableFactory { 349038afb70d70650d87659bb252181ca8645670b8Chris Craik private static final String TAG = "RoundedBitmapDrawableFactory"; 359038afb70d70650d87659bb252181ca8645670b8Chris Craik 369038afb70d70650d87659bb252181ca8645670b8Chris Craik private static class DefaultRoundedBitmapDrawable extends RoundedBitmapDrawable { 379038afb70d70650d87659bb252181ca8645670b8Chris Craik DefaultRoundedBitmapDrawable(Resources res, Bitmap bitmap) { 389038afb70d70650d87659bb252181ca8645670b8Chris Craik super(res, bitmap); 399038afb70d70650d87659bb252181ca8645670b8Chris Craik } 409038afb70d70650d87659bb252181ca8645670b8Chris Craik 419038afb70d70650d87659bb252181ca8645670b8Chris Craik @Override 429038afb70d70650d87659bb252181ca8645670b8Chris Craik public void setMipMap(boolean mipMap) { 439038afb70d70650d87659bb252181ca8645670b8Chris Craik if (mBitmap != null) { 449038afb70d70650d87659bb252181ca8645670b8Chris Craik BitmapCompat.setHasMipMap(mBitmap, mipMap); 459038afb70d70650d87659bb252181ca8645670b8Chris Craik invalidateSelf(); 469038afb70d70650d87659bb252181ca8645670b8Chris Craik } 479038afb70d70650d87659bb252181ca8645670b8Chris Craik } 489038afb70d70650d87659bb252181ca8645670b8Chris Craik 499038afb70d70650d87659bb252181ca8645670b8Chris Craik @Override 509038afb70d70650d87659bb252181ca8645670b8Chris Craik public boolean hasMipMap() { 519038afb70d70650d87659bb252181ca8645670b8Chris Craik return mBitmap != null && BitmapCompat.hasMipMap(mBitmap); 529038afb70d70650d87659bb252181ca8645670b8Chris Craik } 539038afb70d70650d87659bb252181ca8645670b8Chris Craik 549038afb70d70650d87659bb252181ca8645670b8Chris Craik @Override 559038afb70d70650d87659bb252181ca8645670b8Chris Craik void gravityCompatApply(int gravity, int bitmapWidth, int bitmapHeight, 569038afb70d70650d87659bb252181ca8645670b8Chris Craik Rect bounds, Rect outRect) { 579038afb70d70650d87659bb252181ca8645670b8Chris Craik GravityCompat.apply(gravity, bitmapWidth, bitmapHeight, 589038afb70d70650d87659bb252181ca8645670b8Chris Craik bounds, outRect, ViewCompat.LAYOUT_DIRECTION_LTR); 599038afb70d70650d87659bb252181ca8645670b8Chris Craik } 609038afb70d70650d87659bb252181ca8645670b8Chris Craik } 619038afb70d70650d87659bb252181ca8645670b8Chris Craik 629038afb70d70650d87659bb252181ca8645670b8Chris Craik /** 639038afb70d70650d87659bb252181ca8645670b8Chris Craik * Returns a new drawable by creating it from a bitmap, setting initial target density based on 649038afb70d70650d87659bb252181ca8645670b8Chris Craik * the display metrics of the resources. 659038afb70d70650d87659bb252181ca8645670b8Chris Craik */ 669038afb70d70650d87659bb252181ca8645670b8Chris Craik public static RoundedBitmapDrawable create(Resources res, Bitmap bitmap) { 67a52784195525cdb1f2bb4d8dde1b8b314f480957Chet Haase if (Build.VERSION.SDK_INT >= 21) { 689038afb70d70650d87659bb252181ca8645670b8Chris Craik return new RoundedBitmapDrawable21(res, bitmap); 699038afb70d70650d87659bb252181ca8645670b8Chris Craik } 709038afb70d70650d87659bb252181ca8645670b8Chris Craik return new DefaultRoundedBitmapDrawable(res, bitmap); 719038afb70d70650d87659bb252181ca8645670b8Chris Craik } 729038afb70d70650d87659bb252181ca8645670b8Chris Craik 739038afb70d70650d87659bb252181ca8645670b8Chris Craik /** 749038afb70d70650d87659bb252181ca8645670b8Chris Craik * Returns a new drawable, creating it by opening a given file path and decoding the bitmap. 759038afb70d70650d87659bb252181ca8645670b8Chris Craik */ 769038afb70d70650d87659bb252181ca8645670b8Chris Craik public static RoundedBitmapDrawable create(Resources res, 779038afb70d70650d87659bb252181ca8645670b8Chris Craik String filepath) { 789038afb70d70650d87659bb252181ca8645670b8Chris Craik final RoundedBitmapDrawable drawable = create(res, BitmapFactory.decodeFile(filepath)); 799038afb70d70650d87659bb252181ca8645670b8Chris Craik if (drawable.getBitmap() == null) { 803a1a3b98f843ab5c72644da9addb9473d895a826Chris Craik Log.w(TAG, "RoundedBitmapDrawable cannot decode " + filepath); 819038afb70d70650d87659bb252181ca8645670b8Chris Craik } 829038afb70d70650d87659bb252181ca8645670b8Chris Craik return drawable; 839038afb70d70650d87659bb252181ca8645670b8Chris Craik } 849038afb70d70650d87659bb252181ca8645670b8Chris Craik 859038afb70d70650d87659bb252181ca8645670b8Chris Craik 869038afb70d70650d87659bb252181ca8645670b8Chris Craik /** 879038afb70d70650d87659bb252181ca8645670b8Chris Craik * Returns a new drawable, creating it by decoding a bitmap from the given input stream. 889038afb70d70650d87659bb252181ca8645670b8Chris Craik */ 899038afb70d70650d87659bb252181ca8645670b8Chris Craik public static RoundedBitmapDrawable create(Resources res, 909038afb70d70650d87659bb252181ca8645670b8Chris Craik java.io.InputStream is) { 919038afb70d70650d87659bb252181ca8645670b8Chris Craik final RoundedBitmapDrawable drawable = create(res, BitmapFactory.decodeStream(is)); 929038afb70d70650d87659bb252181ca8645670b8Chris Craik if (drawable.getBitmap() == null) { 933a1a3b98f843ab5c72644da9addb9473d895a826Chris Craik Log.w(TAG, "RoundedBitmapDrawable cannot decode " + is); 949038afb70d70650d87659bb252181ca8645670b8Chris Craik } 959038afb70d70650d87659bb252181ca8645670b8Chris Craik return drawable; 969038afb70d70650d87659bb252181ca8645670b8Chris Craik } 979038afb70d70650d87659bb252181ca8645670b8Chris Craik 98c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes private RoundedBitmapDrawableFactory() {} 99c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes 1009038afb70d70650d87659bb252181ca8645670b8Chris Craik} 101