| package com.bumptech.glide.util; |
| |
| import android.annotation.TargetApi; |
| import android.graphics.Bitmap; |
| import android.os.Build; |
| import android.os.Looper; |
| |
| import java.util.ArrayDeque; |
| import java.util.Queue; |
| |
| /** |
| * A collection of assorted utility classes. |
| */ |
| public final class Util { |
| private static final char[] HEX_CHAR_ARRAY = "0123456789abcdef".toCharArray(); |
| // 32 bytes from sha-256 -> 64 hex chars. |
| private static final char[] SHA_256_CHARS = new char[64]; |
| // 20 bytes from sha-1 -> 40 chars. |
| private static final char[] SHA_1_CHARS = new char[40]; |
| |
| private Util() { |
| // Utility class. |
| } |
| |
| /** |
| * Returns the hex string of the given byte array representing a SHA256 hash. |
| */ |
| public static String sha256BytesToHex(byte[] bytes) { |
| return bytesToHex(bytes, SHA_256_CHARS); |
| } |
| |
| /** |
| * Returns the hex string of the given byte array representing a SHA1 hash. |
| */ |
| public static String sha1BytesToHex(byte[] bytes) { |
| return bytesToHex(bytes, SHA_1_CHARS); |
| } |
| |
| // Taken from: |
| // http://stackoverflow.com/questions/9655181/convert-from-byte-array-to-hex-string-in-java/9655275#9655275 |
| private static String bytesToHex(byte[] bytes, char[] hexChars) { |
| int v; |
| for (int j = 0; j < bytes.length; j++) { |
| v = bytes[j] & 0xFF; |
| hexChars[j * 2] = HEX_CHAR_ARRAY[v >>> 4]; |
| hexChars[j * 2 + 1] = HEX_CHAR_ARRAY[v & 0x0F]; |
| } |
| return new String(hexChars); |
| } |
| |
| /** |
| * Returns the allocated byte size of the given bitmap. |
| * |
| * @see #getBitmapByteSize(android.graphics.Bitmap) |
| * |
| * @deprecated Use {@link #getBitmapByteSize(android.graphics.Bitmap)} instead. Scheduled to be removed in Glide |
| * 4.0. |
| */ |
| @Deprecated |
| public static int getSize(Bitmap bitmap) { |
| return getBitmapByteSize(bitmap); |
| } |
| |
| /** |
| * Returns the in memory size of the given {@link Bitmap} in bytes. |
| */ |
| @TargetApi(Build.VERSION_CODES.KITKAT) |
| public static int getBitmapByteSize(Bitmap bitmap) { |
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { |
| // Workaround for KitKat initial release NPE in Bitmap, fixed in MR1. See issue #148. |
| try { |
| return bitmap.getAllocationByteCount(); |
| } catch (NullPointerException e) { |
| // Do nothing. |
| } |
| } |
| return bitmap.getHeight() * bitmap.getRowBytes(); |
| } |
| |
| /** |
| * Returns the in memory size of {@link android.graphics.Bitmap} with the given width, height, and |
| * {@link android.graphics.Bitmap.Config}. |
| */ |
| public static int getBitmapByteSize(int width, int height, Bitmap.Config config) { |
| return width * height * getBytesPerPixel(config); |
| } |
| |
| private static int getBytesPerPixel(Bitmap.Config config) { |
| // A bitmap by decoding a gif has null "config" in certain environments. |
| if (config == null) { |
| config = Bitmap.Config.ARGB_8888; |
| } |
| |
| int bytesPerPixel; |
| switch (config) { |
| case ALPHA_8: |
| bytesPerPixel = 1; |
| break; |
| case RGB_565: |
| case ARGB_4444: |
| bytesPerPixel = 2; |
| break; |
| case ARGB_8888: |
| default: |
| bytesPerPixel = 4; |
| } |
| return bytesPerPixel; |
| } |
| |
| /** |
| * Throws an {@link java.lang.IllegalArgumentException} if called on a thread other than the main thread. |
| */ |
| public static void assertMainThread() { |
| if (!isOnMainThread()) { |
| throw new IllegalArgumentException("You must call this method on the main thread"); |
| } |
| } |
| |
| /** |
| * Throws an {@link java.lang.IllegalArgumentException} if called on the main thread. |
| */ |
| public static void assertBackgroundThread() { |
| if (!isOnBackgroundThread()) { |
| throw new IllegalArgumentException("YOu must call this method on a background thread"); |
| } |
| } |
| |
| /** |
| * Returns {@code true} if called on the main thread, {@code false} otherwise. |
| */ |
| public static boolean isOnMainThread() { |
| return Looper.myLooper() == Looper.getMainLooper(); |
| } |
| |
| /** |
| * Returns {@code true} if called on the main thread, {@code false} otherwise. |
| */ |
| public static boolean isOnBackgroundThread() { |
| return !isOnMainThread(); |
| } |
| |
| /** |
| * Creates a {@link java.util.Queue} of the given size using Glide's preferred implementation. |
| */ |
| public static <T> Queue<T> createQueue(int size) { |
| return new ArrayDeque<T>(size); |
| } |
| } |