GitNex-Android-App/app/src/main/java/org/mian/gitnex/views/ReactionSpinner.java

239 lines
6.4 KiB
Java

package org.mian.gitnex.views;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.cardview.widget.CardView;
import com.vdurmont.emoji.Emoji;
import com.vdurmont.emoji.EmojiManager;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.IssueReaction;
import org.mian.gitnex.models.UISettings;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import retrofit2.Response;
/**
* @author opyale
*/
@SuppressLint("ViewConstructor")
public class ReactionSpinner extends HorizontalScrollView {
private enum ReactionType { COMMENT, ISSUE }
private enum ReactionAction { REMOVE, ADD }
private OnInteractedListener onInteractedListener;
public ReactionSpinner(Context context, Bundle bundle) {
super(context);
LinearLayout root = new LinearLayout(context);
int dens = AppUtil.getPixelsFromDensity(context, 10);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
root.setOrientation(LinearLayout.HORIZONTAL);
root.setPadding(dens, 0, dens, 0);
root.setGravity(Gravity.START);
root.setLayoutParams(layoutParams);
TinyDB tinyDB = TinyDB.getInstance(context);
String loginUid = tinyDB.getString("loginUid");
String repoOwner = bundle.getString("repoOwner");
String repoName = bundle.getString("repoName");
int id;
ReactionType reactionType;
if(bundle.containsKey("commentId")) {
id = bundle.getInt("commentId");
reactionType = ReactionType.COMMENT;
} else {
id = bundle.getInt("issueId");
reactionType = ReactionType.ISSUE;
}
new Thread(() -> {
try {
List<IssueReaction> allReactions = getReactions(repoOwner, repoName, reactionType, id);
for(String allowedReaction : getAllowedReactions()) {
@SuppressLint("InflateParams") CardView reactionButton = (CardView) LayoutInflater.from(context)
.inflate(R.layout.layout_reaction_button, root, false);
IssueReaction myReaction = null;
for(IssueReaction issueReaction : allReactions) {
if(issueReaction.getContent().equals(allowedReaction) && issueReaction.getUser().getLogin().equals(loginUid)) {
myReaction = issueReaction;
break;
}
}
ReactionAction reactionAction;
if(myReaction != null) {
reactionButton.setCardBackgroundColor(AppUtil.getColorFromAttribute(context, R.attr.inputSelectedColor));
reactionAction = ReactionAction.REMOVE;
} else {
reactionAction = ReactionAction.ADD;
}
reactionButton.setOnClickListener(v -> new Thread(() -> {
try {
if(react(repoOwner, repoName, reactionType, reactionAction, new IssueReaction(allowedReaction), id)) {
v.post(() -> onInteractedListener.onInteracted());
}
} catch(IOException ignored) {}
}).start());
Emoji emoji = EmojiManager.getForAlias(allowedReaction);
((TextView) reactionButton.findViewById(R.id.symbol)).setText((emoji == null) ? allowedReaction : emoji.getUnicode());
root.post(() -> root.addView(reactionButton));
}
} catch(IOException ignored) {}
}).start();
setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
addView(root);
}
private boolean react(String repoOwner, String repoName, ReactionType reactionType, ReactionAction reactionAction, IssueReaction issueReaction, int id) throws IOException {
Response<?> response = null;
switch(reactionType) {
case ISSUE:
switch(reactionAction) {
case ADD:
response = RetrofitClient
.getApiInterface(getContext())
.setIssueReaction(Authorization.get(getContext()), repoOwner, repoName, id, issueReaction)
.execute();
break;
case REMOVE:
response = RetrofitClient
.getApiInterface(getContext())
.removeIssueReaction(Authorization.get(getContext()), repoOwner, repoName, id, issueReaction)
.execute();
break;
}
break;
case COMMENT:
switch(reactionAction) {
case ADD:
response = RetrofitClient
.getApiInterface(getContext())
.setIssueCommentReaction(Authorization.get(getContext()), repoOwner, repoName, id, issueReaction)
.execute();
break;
case REMOVE:
response = RetrofitClient
.getApiInterface(getContext())
.removeIssueCommentReaction(Authorization.get(getContext()), repoOwner, repoName, id, issueReaction)
.execute();
break;
}
break;
}
return response.isSuccessful();
}
private List<IssueReaction> getReactions(String repoOwner, String repoName, ReactionType reactionType, int id) throws IOException {
Response<List<IssueReaction>> response = null;
switch(reactionType) {
case ISSUE:
response = RetrofitClient
.getApiInterface(getContext())
.getIssueReactions(Authorization.get(getContext()), repoOwner, repoName, id)
.execute();
break;
case COMMENT:
response = RetrofitClient
.getApiInterface(getContext())
.getIssueCommentReactions(Authorization.get(getContext()), repoOwner, repoName, id)
.execute();
break;
}
if(response.isSuccessful() && response.body() != null)
return response.body();
else
return Collections.emptyList();
}
private List<String> getAllowedReactions() throws IOException {
List<String> allowedReactions = new ArrayList<>();
Response<UISettings> response = RetrofitClient
.getApiInterface(getContext())
.getUISettings(Authorization.get(getContext()))
.execute();
if(response.isSuccessful() && response.body() != null) {
allowedReactions.addAll(Arrays.asList(response.body().getAllowed_reactions()));
} else {
allowedReactions.addAll(Arrays.asList("+1", "-1", "laugh", "hooray", "confused", "heart", "rocket", "eyes"));
}
return allowedReactions;
}
public void setOnInteractedListener(OnInteractedListener onInteractedListener) {
this.onInteractedListener = onInteractedListener;
}
public interface OnInteractedListener { void onInteracted(); }
}