diff --git a/android/app/src/main/java/com/expensify/chat/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/CustomNotificationProvider.java index d3efa5bc6196..643b4eef4dd7 100644 --- a/android/app/src/main/java/com/expensify/chat/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/CustomNotificationProvider.java @@ -2,6 +2,12 @@ import android.content.Context; import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Bitmap.Config; +import android.graphics.PorterDuffXfermode; +import android.graphics.PorterDuff.Mode; import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; @@ -74,6 +80,32 @@ protected NotificationCompat.Builder onExtendBuilder(@NonNull Context context, @ return builder; } + /** + * Creates a canvas to draw a circle and then draws the bitmap avatar within that circle + * to clip off the area of the bitmap outside the circular path and returns a circular + * bitmap. + * + * @param bitmap The bitmap image to modify. + */ + public Bitmap getCroppedBitmap(Bitmap bitmap) { + Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), + bitmap.getHeight(), Config.ARGB_8888); + Canvas canvas = new Canvas(output); + + final int defaultBackgroundColor = 0xff424242; + final Paint paint = new Paint(); + final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); + + paint.setAntiAlias(true); + canvas.drawARGB(0, 0, 0, 0); + paint.setColor(defaultBackgroundColor); + canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, + bitmap.getWidth() / 2, paint); + paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); + canvas.drawBitmap(bitmap, rect, rect, paint); + return output; + } + /** * Applies the message style to the notification builder. It also takes advantage of the * notification cache to build conversations. @@ -208,7 +240,7 @@ private IconCompat fetchIcon(String urlString) { try { Bitmap bitmap = future.get(MAX_ICON_FETCH_WAIT_TIME_SECONDS, TimeUnit.SECONDS); - return IconCompat.createWithBitmap(bitmap); + return IconCompat.createWithBitmap(getCroppedBitmap(bitmap)); } catch (InterruptedException e) { Log.e(TAG,"Failed to fetch icon", e); Thread.currentThread().interrupt();