Skip to content

Commit

Permalink
Fix rounded corners bitmap double free
Browse files Browse the repository at this point in the history
Fixes #4732
// FREEBIE
  • Loading branch information
moxie0 committed Jan 8, 2017
1 parent 5804213 commit 4ad989c
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 15 deletions.
3 changes: 2 additions & 1 deletion res/layout/recent_photo_view_item.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@

<ImageView android:id="@+id/thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent"
android:scaleType="centerCrop"/>

</org.thoughtcrime.securesms.components.SquareFrameLayout>

Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Key;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.signature.MediaStoreSignature;

import org.thoughtcrime.securesms.R;
Expand Down Expand Up @@ -77,6 +78,8 @@ public void onLoaderReset(Loader<Cursor> loader) {

private static class RecentPhotoAdapter extends CursorRecyclerViewAdapter<RecentPhotoAdapter.RecentPhotoViewHolder> {

private static final String TAG = RecentPhotoAdapter.class.getName();

@NonNull private final Uri baseUri;
@Nullable private OnItemClickedListener clickedListener;

Expand Down Expand Up @@ -112,7 +115,7 @@ public void onBindItemViewHolder(RecentPhotoViewHolder viewHolder, @NonNull Curs
.fromMediaStore()
.load(uri)
.signature(signature)
.centerCrop()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(viewHolder.imageView);

viewHolder.imageView.setOnClickListener(new OnClickListener() {
Expand Down
33 changes: 20 additions & 13 deletions src/org/thoughtcrime/securesms/mms/RoundedCorners.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,24 @@ public RoundedCorners(@NonNull Context context, int radius) {
{
final Bitmap toRound = crop ? centerCrop(pool, toTransform, outWidth, outHeight)
: fitCenter(pool, toTransform, outWidth, outHeight);

final Bitmap rounded = round(pool, toRound);
if (toRound != null && toRound != rounded && !pool.put(toRound)) {

if (toRound != null && toRound != rounded && toRound != toTransform && !pool.put(toRound)) {
toRound.recycle();
}

return rounded;
}

private Bitmap centerCrop(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
final Bitmap toReuse = pool.get(outWidth, outHeight, getSafeConfig(toTransform));
final Bitmap transformed = TransformationUtils.centerCrop(toReuse, toTransform, outWidth, outHeight);

if (toReuse != null && toReuse != transformed && !pool.put(toReuse)) {
toReuse.recycle();
}

return transformed;
}

Expand All @@ -63,36 +68,38 @@ private Bitmap round(@NonNull BitmapPool pool, @Nullable Bitmap toRound) {
return null;
}

final Bitmap result;
final Bitmap toReuse = pool.get(toRound.getWidth(), toRound.getHeight(), getSafeConfig(toRound));
if (toReuse != null) {
result = toReuse;
} else {
Bitmap result = pool.get(toRound.getWidth(), toRound.getHeight(), getSafeConfig(toRound));

if (result == null) {
result = Bitmap.createBitmap(toRound.getWidth(), toRound.getHeight(), getSafeConfig(toRound));
}

final Canvas canvas = new Canvas(result);
final Paint cornerPaint = new Paint();
final Paint shaderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
Canvas canvas = new Canvas(result);

shaderPaint.setShader(new BitmapShader(toRound, TileMode.CLAMP, TileMode.CLAMP));
cornerPaint.setColor(colorHint);
if (Config.RGB_565.equals(result.getConfig())) {
Paint cornerPaint = new Paint();
cornerPaint.setColor(colorHint);

canvas.drawRect(0, 0, radius, radius, cornerPaint);
canvas.drawRect(0, toRound.getHeight() - radius, radius, toRound.getHeight(), cornerPaint);
canvas.drawRect(toRound.getWidth() - radius, 0, toRound.getWidth(), radius, cornerPaint);
canvas.drawRect(toRound.getWidth() - radius, toRound.getHeight() - radius, toRound.getWidth(), toRound.getHeight(), cornerPaint);
}

Paint shaderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
shaderPaint.setShader(new BitmapShader(toRound, TileMode.CLAMP, TileMode.CLAMP));

canvas.drawRoundRect(new RectF(0, 0, toRound.getWidth(), toRound.getHeight()), radius, radius, shaderPaint);
// Log.w("RoundedCorners", "in was " + toRound.getWidth() + "x" + toRound.getHeight() + ", out to " + result.getWidth() + "x" + result.getHeight());

return result;
}

private static Bitmap.Config getSafeConfig(Bitmap bitmap) {
return bitmap.getConfig() != null ? bitmap.getConfig() : Bitmap.Config.ARGB_8888;
}

@Override public String getId() {
@Override
public String getId() {
return RoundedCorners.class.getCanonicalName();
}
}

0 comments on commit 4ad989c

Please sign in to comment.