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