mirror of
https://github.com/KokaKiwi/BarInsta
synced 2024-11-16 19:57:31 +00:00
Allow unsend message
This commit is contained in:
parent
6a163454f4
commit
8e3d0af9d3
@ -4,6 +4,7 @@ import android.text.format.DateFormat;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import androidx.annotation.IdRes;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.recyclerview.widget.AdapterListUpdateCallback;
|
import androidx.recyclerview.widget.AdapterListUpdateCallback;
|
||||||
@ -392,6 +393,8 @@ public final class DirectItemsAdapter extends RecyclerView.Adapter<RecyclerView.
|
|||||||
void onReaction(DirectItem item, Emoji emoji);
|
void onReaction(DirectItem item, Emoji emoji);
|
||||||
|
|
||||||
void onReactionClick(DirectItem item, int position);
|
void onReactionClick(DirectItem item, int position);
|
||||||
|
|
||||||
|
void onOptionSelect(DirectItem item, @IdRes int itemId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface DirectItemInternalLongClickListener {
|
public interface DirectItemInternalLongClickListener {
|
||||||
|
@ -81,4 +81,9 @@ public class DirectItemActionLogViewHolder extends DirectItemViewHolder {
|
|||||||
protected boolean showMessageInfo() {
|
protected boolean showMessageInfo() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean allowLongClick() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,4 +30,9 @@ public class DirectItemDefaultViewHolder extends DirectItemViewHolder {
|
|||||||
final Context context = itemView.getContext();
|
final Context context = itemView.getContext();
|
||||||
binding.tvMessage.setText(context.getText(R.string.dms_inbox_raven_message_unknown));
|
binding.tvMessage.setText(context.getText(R.string.dms_inbox_raven_message_unknown));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean allowLongClick() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,4 +33,9 @@ public class DirectItemPlaceholderViewHolder extends DirectItemViewHolder {
|
|||||||
protected boolean showBackground() {
|
protected boolean showBackground() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean allowLongClick() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,4 +71,9 @@ public class DirectItemVideoCallEventViewHolder extends DirectItemViewHolder {
|
|||||||
protected boolean showMessageInfo() {
|
protected boolean showMessageInfo() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean allowLongClick() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||||||
import androidx.transition.TransitionManager;
|
import androidx.transition.TransitionManager;
|
||||||
|
|
||||||
import com.google.android.material.transition.MaterialFade;
|
import com.google.android.material.transition.MaterialFade;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -110,7 +111,7 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder {
|
|||||||
final MessageDirection messageDirection = isSelf(item) ? MessageDirection.OUTGOING : MessageDirection.INCOMING;
|
final MessageDirection messageDirection = isSelf(item) ? MessageDirection.OUTGOING : MessageDirection.INCOMING;
|
||||||
itemView.post(() -> bindBase(item, messageDirection, position));
|
itemView.post(() -> bindBase(item, messageDirection, position));
|
||||||
itemView.post(() -> bindItem(item, messageDirection));
|
itemView.post(() -> bindItem(item, messageDirection));
|
||||||
itemView.post(() -> setupLongClickListener(position));
|
itemView.post(() -> setupLongClickListener(position, messageDirection));
|
||||||
// bindBase(item, messageDirection);
|
// bindBase(item, messageDirection);
|
||||||
// bindItem(item, messageDirection);
|
// bindItem(item, messageDirection);
|
||||||
// setupLongClickListener(position);
|
// setupLongClickListener(position);
|
||||||
@ -479,7 +480,7 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
private void setupLongClickListener(final int position) {
|
private void setupLongClickListener(final int position, final MessageDirection messageDirection) {
|
||||||
if (!allowLongClick()) return;
|
if (!allowLongClick()) return;
|
||||||
binding.getRoot().setOnItemLongClickListener(new DirectItemFrameLayout.OnItemLongClickListener() {
|
binding.getRoot().setOnItemLongClickListener(new DirectItemFrameLayout.OnItemLongClickListener() {
|
||||||
@Override
|
@Override
|
||||||
@ -498,17 +499,24 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder {
|
|||||||
// longClickListener.onLongClick(position, this);
|
// longClickListener.onLongClick(position, this);
|
||||||
itemView.post(() -> grow());
|
itemView.post(() -> grow());
|
||||||
setSelected(true);
|
setSelected(true);
|
||||||
showLongClickOptions(new Point((int) x, (int) y));
|
showLongClickOptions(new Point((int) x, (int) y), messageDirection);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showLongClickOptions(final Point location) {
|
private void showLongClickOptions(final Point location, final MessageDirection messageDirection) {
|
||||||
final DirectItemContextMenu menu = new DirectItemContextMenu(itemView.getContext(), allowReaction(), getLongClickOptions());
|
final List<DirectItemContextMenu.MenuItem> longClickOptions = getLongClickOptions();
|
||||||
|
final ImmutableList.Builder<DirectItemContextMenu.MenuItem> builder = ImmutableList.builder();
|
||||||
|
if (longClickOptions != null) {
|
||||||
|
builder.addAll(longClickOptions);
|
||||||
|
}
|
||||||
|
if (messageDirection == MessageDirection.OUTGOING) {
|
||||||
|
builder.add(new DirectItemContextMenu.MenuItem(R.id.unsend, R.string.dms_inbox_unsend));
|
||||||
|
}
|
||||||
|
final DirectItemContextMenu menu = new DirectItemContextMenu(itemView.getContext(), allowReaction(), builder.build());
|
||||||
menu.setOnDismissListener(() -> setSelected(false));
|
menu.setOnDismissListener(() -> setSelected(false));
|
||||||
menu.setOnReactionClickListener(emoji -> {
|
menu.setOnReactionClickListener(emoji -> callback.onReaction(item, emoji));
|
||||||
callback.onReaction(item, emoji);
|
menu.setOnOptionSelectListener(itemId -> callback.onOptionSelect(item, itemId));
|
||||||
});
|
|
||||||
menu.show(itemView, location);
|
menu.show(itemView, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,6 +222,14 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
|
|||||||
public void onReactionClick(final DirectItem item, final int position) {
|
public void onReactionClick(final DirectItem item, final int position) {
|
||||||
showReactionsDialog(item);
|
showReactionsDialog(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onOptionSelect(final DirectItem item, final int itemId) {
|
||||||
|
if (itemId == R.id.unsend) {
|
||||||
|
handleSentMessage(viewModel.unsend(item));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private final DirectItemLongClickListener directItemLongClickListener = position -> {
|
private final DirectItemLongClickListener directItemLongClickListener = position -> {
|
||||||
|
@ -56,4 +56,10 @@ public interface DirectMessagesRepository {
|
|||||||
@POST("/api/v1/direct_v2/threads/{threadId}/remove_admins/")
|
@POST("/api/v1/direct_v2/threads/{threadId}/remove_admins/")
|
||||||
Call<String> removeAdmins(@Path("threadId") String threadId,
|
Call<String> removeAdmins(@Path("threadId") String threadId,
|
||||||
@FieldMap final Map<String, String> form);
|
@FieldMap final Map<String, String> form);
|
||||||
|
|
||||||
|
@FormUrlEncoded
|
||||||
|
@POST("/api/v1/direct_v2/threads/{threadId}/items/{itemId}/delete/")
|
||||||
|
Call<String> deleteItem(@Path("threadId") String threadId,
|
||||||
|
@Path("itemId") String itemId,
|
||||||
|
@FieldMap final Map<String, String> form);
|
||||||
}
|
}
|
||||||
|
@ -186,14 +186,7 @@ public class DirectThreadViewModel extends AndroidViewModel {
|
|||||||
reactions.setEmojis(emojis);
|
reactions.setEmojis(emojis);
|
||||||
List<DirectItem> list = this.items.getValue();
|
List<DirectItem> list = this.items.getValue();
|
||||||
list = list == null ? new LinkedList<>() : new LinkedList<>(list);
|
list = list == null ? new LinkedList<>() : new LinkedList<>(list);
|
||||||
int index = -1;
|
int index = getItemIndex(item, list);
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
final DirectItem directItem = list.get(i);
|
|
||||||
if (directItem.getItemId().equals(item.getItemId())) {
|
|
||||||
index = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
try {
|
try {
|
||||||
final DirectItem clone = (DirectItem) list.get(index).clone();
|
final DirectItem clone = (DirectItem) list.get(index).clone();
|
||||||
@ -255,14 +248,7 @@ public class DirectThreadViewModel extends AndroidViewModel {
|
|||||||
itemClone.setReactions(reactionsClone);
|
itemClone.setReactions(reactionsClone);
|
||||||
List<DirectItem> list = this.items.getValue();
|
List<DirectItem> list = this.items.getValue();
|
||||||
list = list == null ? new LinkedList<>() : new LinkedList<>(list);
|
list = list == null ? new LinkedList<>() : new LinkedList<>(list);
|
||||||
int index = -1;
|
int index = getItemIndex(item, list);
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
final DirectItem directItem = list.get(i);
|
|
||||||
if (directItem.getItemId().equals(item.getItemId())) {
|
|
||||||
index = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
list.set(index, itemClone);
|
list.set(index, itemClone);
|
||||||
}
|
}
|
||||||
@ -272,6 +258,30 @@ public class DirectThreadViewModel extends AndroidViewModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int removeItem(final DirectItem item) {
|
||||||
|
if (item == null) return 0;
|
||||||
|
List<DirectItem> list = this.items.getValue();
|
||||||
|
list = list == null ? new LinkedList<>() : new LinkedList<>(list);
|
||||||
|
int index = getItemIndex(item, list);
|
||||||
|
if (index >= 0) {
|
||||||
|
list.remove(index);
|
||||||
|
this.items.postValue(list);
|
||||||
|
}
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getItemIndex(final DirectItem item, final List<DirectItem> list) {
|
||||||
|
int index = -1;
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
final DirectItem directItem = list.get(i);
|
||||||
|
if (directItem.getItemId().equals(item.getItemId())) {
|
||||||
|
index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
private void updateItemSent(final String clientContext, final long timestamp) {
|
private void updateItemSent(final String clientContext, final long timestamp) {
|
||||||
if (clientContext == null) return;
|
if (clientContext == null) return;
|
||||||
List<DirectItem> list = this.items.getValue();
|
List<DirectItem> list = this.items.getValue();
|
||||||
@ -675,7 +685,10 @@ public class DirectThreadViewModel extends AndroidViewModel {
|
|||||||
public LiveData<Resource<DirectItem>> sendReaction(final DirectItem item, final Emoji emoji) {
|
public LiveData<Resource<DirectItem>> sendReaction(final DirectItem item, final Emoji emoji) {
|
||||||
final MutableLiveData<Resource<DirectItem>> data = new MutableLiveData<>();
|
final MutableLiveData<Resource<DirectItem>> data = new MutableLiveData<>();
|
||||||
final Long userId = handleCurrentUser(data);
|
final Long userId = handleCurrentUser(data);
|
||||||
if (userId == null) return data;
|
if (userId == null) {
|
||||||
|
data.postValue(Resource.error("userId is null", null));
|
||||||
|
return data;
|
||||||
|
}
|
||||||
final String clientContext = UUID.randomUUID().toString();
|
final String clientContext = UUID.randomUUID().toString();
|
||||||
// Log.d(TAG, "sendText: sending: itemId: " + directItem.getItemId());
|
// Log.d(TAG, "sendText: sending: itemId: " + directItem.getItemId());
|
||||||
data.postValue(Resource.loading(item));
|
data.postValue(Resource.loading(item));
|
||||||
@ -710,6 +723,39 @@ public class DirectThreadViewModel extends AndroidViewModel {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LiveData<Resource<DirectItem>> unsend(final DirectItem item) {
|
||||||
|
final MutableLiveData<Resource<DirectItem>> data = new MutableLiveData<>();
|
||||||
|
if (item == null) {
|
||||||
|
data.postValue(Resource.error("item is null", null));
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
final int index = removeItem(item);
|
||||||
|
final Call<String> request = service.deleteItem(threadId, item.getItemId());
|
||||||
|
request.enqueue(new Callback<String>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull final Call<String> call, @NonNull final Response<String> response) {
|
||||||
|
if (response.isSuccessful()) {
|
||||||
|
// Log.d(TAG, "onResponse: " + response.body());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// add the item back if unsuccessful
|
||||||
|
addItems(index, Collections.singletonList(item));
|
||||||
|
if (response.errorBody() != null) {
|
||||||
|
handleErrorBody(call, response, data, item);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
data.postValue(Resource.error("request was not successful and response error body was null", item));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull final Call<String> call, @NonNull final Throwable t) {
|
||||||
|
data.postValue(Resource.error(t.getMessage(), item));
|
||||||
|
Log.e(TAG, "enqueueRequest: onFailure: ", t);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
private void handleBroadcastReactionRequest(final MutableLiveData<Resource<DirectItem>> data,
|
private void handleBroadcastReactionRequest(final MutableLiveData<Resource<DirectItem>> data,
|
||||||
final DirectItem item,
|
final DirectItem item,
|
||||||
@NonNull final Call<DirectThreadBroadcastResponse> request) {
|
@NonNull final Call<DirectThreadBroadcastResponse> request) {
|
||||||
|
@ -238,4 +238,13 @@ public class DirectMessagesService extends BaseService {
|
|||||||
);
|
);
|
||||||
return repository.removeAdmins(threadId, form);
|
return repository.removeAdmins(threadId, form);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Call<String> deleteItem(final String threadId,
|
||||||
|
final String itemId) {
|
||||||
|
final ImmutableMap<String, String> form = ImmutableMap.of(
|
||||||
|
"_csrftoken", csrfToken,
|
||||||
|
"_uuid", deviceUuid
|
||||||
|
);
|
||||||
|
return repository.deleteItem(threadId, itemId, form);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user