From 16f547fed225e50065a996199de0772caf6ee94c Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 4 Oct 2022 12:22:18 +0200 Subject: [PATCH] Add support for commit statuses (#1212) Addresses https://codeberg.org/gitnex/GitNex/issues/435 but only supports commits and not PRs. Co-authored-by: qwerty287 Co-authored-by: M M Arif Co-authored-by: M M Arif Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/1212 Reviewed-by: M M Arif Co-authored-by: qwerty287 Co-committed-by: qwerty287 --- .../adapters/CommitStatusesAdapter.java | 120 ++++++++++++++++++ .../fragments/CommitDetailFragment.java | 81 +++++++++++- .../java/org/mian/gitnex/helpers/AppUtil.java | 3 +- app/src/main/res/drawable/ic_dot_fill.xml | 10 ++ .../res/layout/fragment_commit_details.xml | 61 +++++++++ .../main/res/layout/list_commit_status.xml | 61 +++++++++ app/src/main/res/values/strings.xml | 3 + 7 files changed, 337 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/org/mian/gitnex/adapters/CommitStatusesAdapter.java create mode 100644 app/src/main/res/drawable/ic_dot_fill.xml create mode 100644 app/src/main/res/layout/list_commit_status.xml diff --git a/app/src/main/java/org/mian/gitnex/adapters/CommitStatusesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/CommitStatusesAdapter.java new file mode 100644 index 00000000..fedd2910 --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/adapters/CommitStatusesAdapter.java @@ -0,0 +1,120 @@ +package org.mian.gitnex.adapters; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.core.widget.ImageViewCompat; +import androidx.recyclerview.widget.RecyclerView; +import java.util.List; +import org.gitnex.tea4j.v2.models.CommitStatus; +import org.mian.gitnex.R; +import org.mian.gitnex.helpers.AppUtil; +import org.mian.gitnex.helpers.Toasty; + +/** + * @author qwerty287 + */ +public class CommitStatusesAdapter + extends RecyclerView.Adapter { + + private final List statuses; + + static class CommitStatusesViewHolder extends RecyclerView.ViewHolder { + + private CommitStatus status; + + private final TextView name; + private final TextView description; + private final ImageView icon; + + private CommitStatusesViewHolder(View itemView) { + + super(itemView); + + icon = itemView.findViewById(R.id.statusIcon); + name = itemView.findViewById(R.id.name); + description = itemView.findViewById(R.id.description); + + itemView.setOnClickListener(taskInfo -> openUrl()); + } + + private void openUrl() { + if (status.getTargetUrl() != null && !status.getTargetUrl().equals("")) { + AppUtil.openUrlInBrowser(itemView.getContext(), status.getTargetUrl()); + } else { + Toasty.info( + itemView.getContext(), + itemView.getContext().getString(R.string.statusNoUrl)); + } + } + } + + public CommitStatusesAdapter(List statuses) { + this.statuses = statuses; + } + + @NonNull @Override + public CommitStatusesAdapter.CommitStatusesViewHolder onCreateViewHolder( + @NonNull ViewGroup parent, int viewType) { + + View v = + LayoutInflater.from(parent.getContext()) + .inflate(R.layout.list_commit_status, parent, false); + return new CommitStatusesAdapter.CommitStatusesViewHolder(v); + } + + @Override + public void onBindViewHolder( + @NonNull CommitStatusesAdapter.CommitStatusesViewHolder holder, int position) { + + CommitStatus currentItem = statuses.get(position); + Context ctx = holder.itemView.getContext(); + + holder.status = currentItem; + holder.name.setText(currentItem.getContext()); + holder.description.setText(currentItem.getDescription()); + switch (currentItem.getStatus().toLowerCase()) { + case "pending": + holder.icon.setImageResource(R.drawable.ic_dot_fill); + ImageViewCompat.setImageTintList( + holder.icon, + ColorStateList.valueOf( + ctx.getResources().getColor(R.color.lightYellow, null))); + break; + case "success": + holder.icon.setImageResource(R.drawable.ic_check); + ImageViewCompat.setImageTintList( + holder.icon, + ColorStateList.valueOf( + ctx.getResources().getColor(R.color.colorLightGreen, null))); + break; + case "error": + case "failure": + holder.icon.setImageResource(R.drawable.ic_close); + ImageViewCompat.setImageTintList( + holder.icon, + ColorStateList.valueOf( + ctx.getResources().getColor(R.color.iconIssuePrClosedColor, null))); + break; + case "warning": + holder.icon.setImageResource(R.drawable.ic_warning); + ImageViewCompat.setImageTintList( + holder.icon, + ColorStateList.valueOf( + ctx.getResources().getColor(R.color.lightYellow, null))); + break; + default: + holder.icon.setVisibility(View.GONE); + } + } + + @Override + public int getItemCount() { + return statuses.size(); + } +} diff --git a/app/src/main/java/org/mian/gitnex/fragments/CommitDetailFragment.java b/app/src/main/java/org/mian/gitnex/fragments/CommitDetailFragment.java index 9d4b3785..6006e509 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/CommitDetailFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/CommitDetailFragment.java @@ -18,9 +18,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import org.gitnex.tea4j.v2.models.Commit; +import org.gitnex.tea4j.v2.models.CommitStatus; import org.mian.gitnex.R; import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.ProfileActivity; +import org.mian.gitnex.adapters.CommitStatusesAdapter; import org.mian.gitnex.adapters.DiffFilesAdapter; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.RetrofitClient; @@ -84,6 +86,18 @@ public class CommitDetailFragment extends Fragment { getCommit(); getDiff(); + getStatuses(); + + binding.statuses.setOnClickListener( + view -> { + if (binding.statusesLv.getVisibility() == View.GONE) { + binding.statusesExpandCollapse.setImageResource(R.drawable.ic_chevron_up); + binding.statusesLv.setVisibility(View.VISIBLE); + } else { + binding.statusesExpandCollapse.setImageResource(R.drawable.ic_chevron_down); + binding.statusesLv.setVisibility(View.GONE); + } + }); binding.close.setOnClickListener((v) -> requireActivity().finish()); @@ -371,9 +385,74 @@ public class CommitDetailFragment extends Fragment { }); } + private void getStatuses() { + RetrofitClient.getApiInterface(requireContext()) + .repoListStatuses(repoOwner, repoName, sha, null, null, null, null) + .enqueue( + new Callback<>() { + + @Override + public void onResponse( + @NonNull Call> call, + @NonNull Response> response) { + + checkLoading(); + + if (!response.isSuccessful() || response.body() == null) { + onFailure(call, new Throwable()); + return; + } + + if (response.body().size() < 1) { + binding.statusesLvMain.setVisibility(View.GONE); + return; + } + + // merge statuses: a status can be added multiple times with the + // same context, so we only use the newest one + ArrayList result = new ArrayList<>(); + for (CommitStatus c : response.body()) { + CommitStatus statusInList = null; + for (CommitStatus s : result) { + if (Objects.equals(s.getContext(), c.getContext())) { + statusInList = s; + break; + } + } + if (statusInList != null) { + // if the status that's already in the list was created + // before this one, replace it + if (statusInList.getCreatedAt().before(c.getCreatedAt())) { + result.remove(statusInList); + result.add(c); + } + } else { + result.add(c); + } + } + + binding.statusesList.setLayoutManager( + new LinearLayoutManager(requireContext())); + binding.statusesList.setAdapter(new CommitStatusesAdapter(result)); + } + + @Override + public void onFailure( + @NonNull Call> call, @NonNull Throwable t) { + + checkLoading(); + if (getContext() != null) { + Toasty.error( + requireContext(), getString(R.string.genericError)); + requireActivity().finish(); + } + } + }); + } + private void checkLoading() { loadingFinished += 1; - if (loadingFinished >= 2) { + if (loadingFinished >= 3) { binding.progressBar.setVisibility(View.GONE); } } diff --git a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java index f74139e6..8af96570 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java @@ -19,6 +19,7 @@ import android.util.Base64; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; +import androidx.annotation.AttrRes; import androidx.annotation.ColorInt; import androidx.browser.customtabs.CustomTabColorSchemeParams; import androidx.browser.customtabs.CustomTabsIntent; @@ -330,7 +331,7 @@ public class AppUtil { } @ColorInt - public static int getColorFromAttribute(Context context, int resid) { + public static int getColorFromAttribute(Context context, @AttrRes int resid) { TypedValue typedValue = new TypedValue(); context.getTheme().resolveAttribute(resid, typedValue, true); diff --git a/app/src/main/res/drawable/ic_dot_fill.xml b/app/src/main/res/drawable/ic_dot_fill.xml new file mode 100644 index 00000000..669431ad --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_fill.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_commit_details.xml b/app/src/main/res/layout/fragment_commit_details.xml index 6ceea373..f51a5e24 100644 --- a/app/src/main/res/layout/fragment_commit_details.xml +++ b/app/src/main/res/layout/fragment_commit_details.xml @@ -181,6 +181,67 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_commit_status.xml b/app/src/main/res/layout/list_commit_status.xml new file mode 100644 index 00000000..379d9819 --- /dev/null +++ b/app/src/main/res/layout/list_commit_status.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0f6cd6ce..abea9359 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -844,4 +844,7 @@ %1$s referenced this pull request in #%2$d %3$s %3$s %4$s]]> + Statuses + This status has no linked target URL. +