Skip to content

Commit e62528d

Browse files
committed
Fix for lollipop notifications not rendering generated avatars.
// FREEBIE Fixes signalapp#3120 Closes signalapp#3122
1 parent 2d8de52 commit e62528d

File tree

2 files changed

+56
-21
lines changed

2 files changed

+56
-21
lines changed

src/org/thoughtcrime/securesms/notifications/MessageNotifier.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import android.content.Context;
2525
import android.content.Intent;
2626
import android.database.Cursor;
27+
import android.graphics.Bitmap;
2728
import android.graphics.BitmapFactory;
2829
import android.graphics.Color;
2930
import android.graphics.drawable.Drawable;
@@ -178,12 +179,17 @@ private static void sendSingleThreadNotification(Context context,
178179
return;
179180
}
180181

181-
List<NotificationItem> notifications = notificationState.getNotifications();
182-
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
183-
Recipient recipient = notifications.get(0).getIndividualRecipient();
184-
Drawable recipientPhoto = recipient.getContactPhoto();
182+
List<NotificationItem> notifications = notificationState.getNotifications();
183+
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
184+
Recipient recipient = notifications.get(0).getIndividualRecipient();
185+
Drawable recipientPhoto = recipient.getContactPhoto();
186+
int largeIconTargetSize = context.getResources().getDimensionPixelSize(R.dimen.contact_photo_target_size);
187+
188+
if (recipientPhoto != null) {
189+
Bitmap recipientPhotoBitmap = BitmapUtil.createFromDrawable(recipientPhoto, largeIconTargetSize, largeIconTargetSize);
190+
if (recipientPhotoBitmap != null) builder.setLargeIcon(recipientPhotoBitmap);
191+
}
185192

186-
if (recipientPhoto != null) builder.setLargeIcon(BitmapUtil.createFromDrawable(recipientPhoto));
187193
builder.setSmallIcon(R.drawable.icon_notification);
188194
builder.setColor(context.getResources().getColor(R.color.textsecure_primary));
189195
builder.setContentTitle(recipient.toShortString());

src/org/thoughtcrime/securesms/util/BitmapUtil.java

+45-16
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
import android.graphics.drawable.BitmapDrawable;
1616
import android.graphics.drawable.Drawable;
1717
import android.net.Uri;
18+
import android.os.Handler;
19+
import android.os.Looper;
1820
import android.util.Log;
1921
import android.util.Pair;
2022

2123
import com.android.gallery3d.data.Exif;
24+
import com.makeramen.RoundedDrawable;
2225

2326
import org.thoughtcrime.securesms.crypto.MasterSecret;
2427
import org.thoughtcrime.securesms.mms.PartAuthority;
@@ -28,6 +31,7 @@
2831
import java.io.ByteArrayOutputStream;
2932
import java.io.IOException;
3033
import java.io.InputStream;
34+
import java.util.concurrent.atomic.AtomicBoolean;
3135

3236
public class BitmapUtil {
3337
private static final String TAG = BitmapUtil.class.getSimpleName();
@@ -255,22 +259,47 @@ public static Bitmap getCircleBitmap(Bitmap bitmap) {
255259
return output;
256260
}
257261

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+
});
272299

273-
return bitmap;
300+
synchronized (result) {
301+
while (!created.get()) Util.wait(result, 0);
302+
return result[0];
303+
}
274304
}
275-
276305
}

0 commit comments

Comments
 (0)