Signal-Android/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChip.java

118 lines
3.5 KiB
Java

package org.thoughtcrime.securesms.contacts;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.google.android.material.chip.Chip;
import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.recipients.Recipient;
public final class ContactChip extends Chip {
@Nullable private SelectedContact contact;
public ContactChip(Context context) {
super(context);
}
public ContactChip(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ContactChip(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setContact(@NonNull SelectedContact contact) {
this.contact = contact;
}
public @Nullable SelectedContact getContact() {
return contact;
}
public void setAvatar(@NonNull GlideRequests requestManager, @Nullable Recipient recipient) {
if (recipient != null) {
requestManager.clear(this);
Drawable fallbackContactPhotoDrawable = recipient.getFallbackContactPhotoDrawable(getContext(), false);
ContactPhoto contactPhoto = recipient.getContactPhoto();
if (contactPhoto == null) {
setChipIcon(new HalfScaleDrawable(fallbackContactPhotoDrawable));
} else {
requestManager.load(contactPhoto)
.fallback(fallbackContactPhotoDrawable)
.error(fallbackContactPhotoDrawable)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.circleCrop()
.into(new CustomTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
setChipIcon(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
setChipIcon(placeholder);
}
});
}
}
}
private static class HalfScaleDrawable extends Drawable {
private final Drawable fallbackContactPhotoDrawable;
HalfScaleDrawable(Drawable fallbackContactPhotoDrawable) {
this.fallbackContactPhotoDrawable = fallbackContactPhotoDrawable;
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
fallbackContactPhotoDrawable.setBounds(left, top, 2 * right - left, 2 * bottom - top);
}
@Override
public void setBounds(@NonNull Rect bounds) {
super.setBounds(bounds);
}
@Override
public void draw(@NonNull Canvas canvas) {
canvas.save();
canvas.scale(0.5f, 0.5f);
fallbackContactPhotoDrawable.draw(canvas);
canvas.restore();
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.OPAQUE;
}
}
}