|
15 | 15 | import android.graphics.drawable.BitmapDrawable;
|
16 | 16 | import android.graphics.drawable.Drawable;
|
17 | 17 | import android.net.Uri;
|
| 18 | +import android.os.Handler; |
| 19 | +import android.os.Looper; |
18 | 20 | import android.util.Log;
|
19 | 21 | import android.util.Pair;
|
20 | 22 |
|
21 | 23 | import com.android.gallery3d.data.Exif;
|
| 24 | +import com.makeramen.RoundedDrawable; |
22 | 25 |
|
23 | 26 | import org.thoughtcrime.securesms.crypto.MasterSecret;
|
24 | 27 | import org.thoughtcrime.securesms.mms.PartAuthority;
|
|
28 | 31 | import java.io.ByteArrayOutputStream;
|
29 | 32 | import java.io.IOException;
|
30 | 33 | import java.io.InputStream;
|
| 34 | +import java.util.concurrent.atomic.AtomicBoolean; |
31 | 35 |
|
32 | 36 | public class BitmapUtil {
|
33 | 37 | private static final String TAG = BitmapUtil.class.getSimpleName();
|
@@ -255,22 +259,47 @@ public static Bitmap getCircleBitmap(Bitmap bitmap) {
|
255 | 259 | return output;
|
256 | 260 | }
|
257 | 261 |
|
258 |
| - public static Bitmap createFromDrawable(Drawable drawable) { |
259 |
| - if (drawable instanceof BitmapDrawable) { |
260 |
| - return ((BitmapDrawable)drawable).getBitmap(); |
261 |
| - } |
262 |
| - |
263 |
| - int width = drawable.getIntrinsicWidth(); |
264 |
| - width = width > 0 ? width : 1; |
265 |
| - |
266 |
| - int height = drawable.getIntrinsicHeight(); |
267 |
| - height = height > 0 ? height : 1; |
268 |
| - |
269 |
| - Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); |
270 |
| - Canvas canvas = new Canvas(bitmap); |
271 |
| - drawable.draw(canvas); |
| 262 | + public static Bitmap createFromDrawable(final Drawable drawable, final int width, final int height) { |
| 263 | + final AtomicBoolean created = new AtomicBoolean(false); |
| 264 | + final Bitmap[] result = new Bitmap[1]; |
| 265 | + |
| 266 | + new Handler(Looper.getMainLooper()).post(new Runnable() { |
| 267 | + @Override |
| 268 | + public void run() { |
| 269 | + if (drawable instanceof BitmapDrawable) { |
| 270 | + result[0] = ((BitmapDrawable) drawable).getBitmap(); |
| 271 | + } else { |
| 272 | + int canvasWidth = drawable.getIntrinsicWidth(); |
| 273 | + if (canvasWidth <= 0) canvasWidth = width; |
| 274 | + |
| 275 | + int canvasHeight = drawable.getIntrinsicHeight(); |
| 276 | + if (canvasHeight <= 0) canvasHeight = height; |
| 277 | + |
| 278 | + Bitmap bitmap; |
| 279 | + |
| 280 | + try { |
| 281 | + bitmap = Bitmap.createBitmap(canvasWidth, canvasHeight, Bitmap.Config.ARGB_8888); |
| 282 | + Canvas canvas = new Canvas(bitmap); |
| 283 | + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); |
| 284 | + drawable.draw(canvas); |
| 285 | + } catch (Exception e) { |
| 286 | + Log.w(TAG, e); |
| 287 | + bitmap = null; |
| 288 | + } |
| 289 | + |
| 290 | + result[0] = bitmap; |
| 291 | + } |
| 292 | + |
| 293 | + synchronized (result) { |
| 294 | + created.set(true); |
| 295 | + result.notifyAll(); |
| 296 | + } |
| 297 | + } |
| 298 | + }); |
272 | 299 |
|
273 |
| - return bitmap; |
| 300 | + synchronized (result) { |
| 301 | + while (!created.get()) Util.wait(result, 0); |
| 302 | + return result[0]; |
| 303 | + } |
274 | 304 | }
|
275 |
| - |
276 | 305 | }
|
0 commit comments