1/*
2 * Copyright (C) 2012 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.dialer.util;
18
19import android.content.Context;
20import android.graphics.Bitmap;
21import android.graphics.Canvas;
22import android.graphics.drawable.BitmapDrawable;
23import android.graphics.drawable.Drawable;
24import android.support.annotation.NonNull;
25import android.support.annotation.Nullable;
26import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
27import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
28import com.android.dialer.common.LogUtil;
29
30/** Provides utilities for bitmaps and drawables. */
31public class DrawableConverter {
32
33  private DrawableConverter() {}
34
35  /** Converts the provided drawable to a bitmap using the drawable's intrinsic width and height. */
36  @Nullable
37  public static Bitmap drawableToBitmap(@Nullable Drawable drawable) {
38    return drawableToBitmap(drawable, 0, 0);
39  }
40
41  /**
42   * Converts the provided drawable to a bitmap with the specified width and height.
43   *
44   * <p>If both width and height are 0, the drawable's intrinsic width and height are used (but in
45   * that case {@link #drawableToBitmap(Drawable)} should be used).
46   */
47  @Nullable
48  public static Bitmap drawableToBitmap(@Nullable Drawable drawable, int width, int height) {
49    if (drawable == null) {
50      return null;
51    }
52
53    Bitmap bitmap;
54    if (drawable instanceof BitmapDrawable) {
55      bitmap = ((BitmapDrawable) drawable).getBitmap();
56    } else {
57      if (width > 0 || height > 0) {
58        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
59      } else if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
60        // Needed for drawables that are just a colour.
61        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
62      } else {
63        bitmap =
64            Bitmap.createBitmap(
65                drawable.getIntrinsicWidth(),
66                drawable.getIntrinsicHeight(),
67                Bitmap.Config.ARGB_8888);
68      }
69
70      LogUtil.i(
71          "DrawableConverter.drawableToBitmap",
72          "created bitmap with width: %d, height: %d",
73          bitmap.getWidth(),
74          bitmap.getHeight());
75
76      Canvas canvas = new Canvas(bitmap);
77      drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
78      drawable.draw(canvas);
79    }
80    return bitmap;
81  }
82
83  @Nullable
84  public static Drawable getRoundedDrawable(
85      @NonNull Context context, @Nullable Drawable photo, int width, int height) {
86    Bitmap bitmap = drawableToBitmap(photo);
87    if (bitmap != null) {
88      Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);
89      RoundedBitmapDrawable drawable =
90          RoundedBitmapDrawableFactory.create(context.getResources(), scaledBitmap);
91      drawable.setAntiAlias(true);
92      drawable.setCornerRadius(drawable.getIntrinsicHeight() / 2);
93      return drawable;
94    }
95    return null;
96  }
97}
98