채팅 앱 오픈소스를 개선하고 개선사항을 기록합니다.
public MESSAGE getMessage(int idx) throws Exception {
if(idx >= 0)
return (MESSAGE) items.get(idx);
else
throw new Exception("Wrong Index.");
}
public MESSAGE getMessage(String content) throws Exception{
for(Wrapper item : items){
MESSAGE message = (MESSAGE) item;
if(message.equals(message)){
return (MESSAGE) items.get(0);
}
}
return null;
}
public interface SetOnClickItemListener {
public void onDeleteClick(DialogsListAdapter.BaseDialogViewHolder holder, View view, String itemId, int getAdapterPosition);
}
public void setOnItemClickListener(SetOnClickItemListener listener) {
this.listener = listener;
}
deleteLayout.setOnClickListener(view -> {
if(listener != null){
listener.onDeleteClick((BaseDialogViewHolder)DialogViewHolder.this, view, dialog.getId(), getAdapterPosition());
}
});
dialogsAdapter.setOnItemClickListener(new SetOnClickItemListener() {
@Override
public void onDeleteClick(DialogsListAdapter.BaseDialogViewHolder holder, View view, String itemId, int getAdapterPosition) {
dialogsAdapter.deleteById(itemId);
}
});
public void deleteById(String id) {
for (int i = 0; i < items.size(); i++) {
if (items.get(i).getId().equals(id)) {
items.remove(i);
notifyItemRemoved(i);
}
}
}
Modify DTO and related methods
public void deleteById(int id) {
int idx = binarySerach(id, 0, items.size());
items.remove(idx);
notifyItemRemoved(idx);
}
public int binarySerach(int key, int low, int high){
int mid;
if(low <= high) {
mid = (low + high) / 2;
int cur = items.get(mid).getId();
if(key == cur) {
return mid;
} else if(key < cur) {
return binarySerach(key ,low, mid-1);
} else {
return binarySerach(key, mid+1, high);
}
}
throw new IndexOutOfBoundsException("Invalidate Key");
}
The demo app has a bug that does not load avatar images.
Because avatar image use http url.
Therefore, it should be specified in the manifest file as follows.
<application
...
android:usesCleartextTraffic="true">
Information exposure through an error message
e.printStackTrace(); -> System.out.println(e);
Before the improvement, the source could only send the image url uploaded to the server,
but after the improvement, the image can be selected from the album and sent immediately.
In addition, the cropper function has been added to edit the selected image in the album.
void loadImage(ImageView imageView, @Nullable String url, @Nullable Object payload, @Nullable Bitmap bitmap);
public Bitmap getImageBitmap() {return image == null ? null : image.bitmap;}
public static class Image {
private String url;
private Bitmap bitmap;
public Image(String url) {
this.url = url;
}
public Image(Bitmap bitmap) {this.bitmap = bitmap; }
}
private short getContentViewType(IMessage message) {
if (message instanceof MessageContentType.Image
&& ((MessageContentType.Image) message).getImageUrl() != null
|| ((MessageContentType.Image) message).getImageBitmap() != null) {
return VIEW_TYPE_IMAGE_MESSAGE;
}
imageLoader = new ImageLoader() {
@Override
public void loadImage(ImageView imageView, @Nullable String url, @Nullable Object payload, @Nullable Bitmap bitmap) {
if(url == null)
imageView.setImageBitmap(bitmap);
else
Picasso.get().load(url).into(imageView);
}
};
@Override
public void onBind(MESSAGE message) {
super.onBind(message);
if (image != null && imageLoader != null) {
imageLoader.loadImage(image, message.getImageUrl(), getPayloadForImageLoader(message), message.getImageBitmap());
}
if (imageOverlay != null) {
imageOverlay.setSelected(isSelected());
}
}