reload tags after delete and new tag, other minor fixes

This commit is contained in:
M M Arif
2022-04-19 15:42:03 +05:00
parent 463a5eed4d
commit 49a532e462
6 changed files with 94 additions and 72 deletions
@@ -111,7 +111,6 @@ public class CreateReleaseActivity extends BaseActivity {
}
createNewTag.setOnClickListener(v -> createNewTag());
}
private void createNewTag() {
@@ -152,6 +151,10 @@ public class CreateReleaseActivity extends BaseActivity {
public void onResponse(@NonNull Call<Tag> call, @NonNull retrofit2.Response<Tag> response) {
if (response.code() == 201) {
Intent result = new Intent();
result.putExtra("updateReleases", true);
setResult(201, result);
Toasty.success(ctx, getString(R.string.tagCreated));
finish();
}
@@ -10,32 +10,38 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import org.gitnex.tea4j.v2.models.Tag;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.Toasty;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Author qwerty287
* @author qwerty287
*/
public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder> {
private List<Tag> tags;
private final Context context;
private final String repo;
private final String owner;
private static String repo;
private static String owner;
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
static class TagsViewHolder extends RecyclerView.ViewHolder {
class TagsViewHolder extends RecyclerView.ViewHolder {
private Tag tagsHolder;
private final TextView tagName;
private final TextView tagBody;
private final LinearLayout downloadFrame;
@@ -57,6 +63,24 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
releaseTarDownload = itemView.findViewById(R.id.releaseTarDownload);
downloadDropdownIcon = itemView.findViewById(R.id.downloadDropdownIcon);
options = itemView.findViewById(R.id.tagsOptionsMenu);
options.setOnClickListener(v -> {
final Context context = v.getContext();
@SuppressLint("InflateParams")
View view = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_tag_in_list, null);
TextView delete = view.findViewById(R.id.tagMenuDelete);
BottomSheetDialog dialog = new BottomSheetDialog(context);
dialog.setContentView(view);
dialog.show();
delete.setOnClickListener(v1 -> {
tagDeleteDialog(context, tagsHolder.getName(), owner, repo, getBindingAdapterPosition());
dialog.dismiss();
});
});
}
}
@@ -78,6 +102,7 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
public void onBindViewHolder(@NonNull TagsViewHolder holder, int position) {
Tag currentItem = tags.get(position);
holder.tagsHolder = currentItem;
holder.tagName.setText(currentItem.getName());
@@ -106,24 +131,6 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
holder.options.setVisibility(View.GONE);
}
holder.options.setOnClickListener(v -> {
final Context context = v.getContext();
@SuppressLint("InflateParams")
View view = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_tag_in_list, null);
TextView delete = view.findViewById(R.id.tagMenuDelete);
BottomSheetDialog dialog = new BottomSheetDialog(context);
dialog.setContentView(view);
dialog.show();
delete.setOnClickListener(v1 -> {
AlertDialogs.tagDeleteDialog(context, currentItem.getName(), owner, repo);
dialog.dismiss();
});
});
holder.releaseZipDownload.setText(
HtmlCompat.fromHtml("<a href='" + currentItem.getZipballUrl() + "'>" + context.getResources().getString(R.string.zipArchiveDownloadReleasesTab) + "</a> ", HtmlCompat.FROM_HTML_MODE_LEGACY));
holder.releaseZipDownload.setMovementMethod(LinkMovementMethod.getInstance());
@@ -150,6 +157,7 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
}
}
@SuppressLint("NotifyDataSetChanged")
public void notifyDataChanged() {
notifyDataSetChanged();
isLoading = false;
@@ -170,4 +178,45 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
notifyDataChanged();
}
private void updateAdapter(int position) {
tags.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, tags.size());
}
public void tagDeleteDialog(final Context context, final String tagName, final String owner, final String repo, int position) {
new AlertDialog.Builder(context)
.setTitle(String.format(context.getString(R.string.deleteTagTitle), tagName))
.setMessage(R.string.deleteTagConfirmation)
.setIcon(R.drawable.ic_delete)
.setPositiveButton(R.string.menuDeleteText, (dialog, whichButton) -> RetrofitClient
.getApiInterface(context).repoDeleteTag(owner, repo, tagName).enqueue(new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
if(response.isSuccessful()) {
updateAdapter(position);
Toasty.success(context, context.getString(R.string.tagDeleted));
}
else if(response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 409) {
Toasty.error(context, context.getString(R.string.tagDeleteError));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericError));
}
}))
.setNeutralButton(R.string.cancelButton, null).show();
}
}
@@ -30,6 +30,7 @@ import java.util.List;
public class ReleasesFragment extends Fragment {
private ReleasesViewModel releasesViewModel;
private ReleasesAdapter adapter;
private TagsAdapter tagsAdapter;
private RepositoryContext repository;
@@ -38,7 +39,7 @@ public class ReleasesFragment extends Fragment {
private int page = 1;
private int pageReleases = 1;
public ReleasesFragment() {
public ReleasesFragment() {
}
public static ReleasesFragment newInstance(RepositoryContext repository) {
@@ -59,6 +60,7 @@ public class ReleasesFragment extends Fragment {
Bundle savedInstanceState) {
fragmentReleasesBinding = FragmentReleasesBinding.inflate(inflater, container, false);
releasesViewModel = new ViewModelProvider(this).get(ReleasesViewModel.class);
fragmentReleasesBinding.recyclerView.setHasFixedSize(true);
fragmentReleasesBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
@@ -70,9 +72,9 @@ public class ReleasesFragment extends Fragment {
fragmentReleasesBinding.pullToRefresh.setRefreshing(false);
if(repository.isReleasesViewTypeIsTag()) {
ReleasesViewModel.loadTagsList(repository.getOwner(), repository.getName(), getContext());
releasesViewModel.loadTagsList(repository.getOwner(), repository.getName(), getContext());
} else {
ReleasesViewModel.loadReleasesList(repository.getOwner(), repository.getName(), getContext());
releasesViewModel.loadReleasesList(repository.getOwner(), repository.getName(), getContext());
}
fragmentReleasesBinding.progressBar.setVisibility(View.VISIBLE);
@@ -86,9 +88,9 @@ public class ReleasesFragment extends Fragment {
page = 1;
pageReleases = 1;
if(repository.isReleasesViewTypeIsTag()) {
ReleasesViewModel.loadTagsList(repository.getOwner(), repository.getName(), getContext());
releasesViewModel.loadTagsList(repository.getOwner(), repository.getName(), getContext());
} else {
ReleasesViewModel.loadReleasesList(repository.getOwner(), repository.getName(), getContext());
releasesViewModel.loadReleasesList(repository.getOwner(), repository.getName(), getContext());
}
fragmentReleasesBinding.progressBar.setVisibility(View.VISIBLE);
});
@@ -108,7 +110,7 @@ public class ReleasesFragment extends Fragment {
@Override
public void onLoadMore() {
pageReleases += 1;
ReleasesViewModel.loadMoreReleases(owner, repo, pageReleases, getContext(), adapter);
releasesViewModel.loadMoreReleases(owner, repo, pageReleases, getContext(), adapter);
fragmentReleasesBinding.progressBar.setVisibility(View.VISIBLE);
}
@@ -145,7 +147,7 @@ public class ReleasesFragment extends Fragment {
@Override
public void onLoadMore() {
page += 1;
ReleasesViewModel.loadMoreTags(owner, repo , page, getContext(), tagsAdapter);
releasesViewModel.loadMoreTags(owner, repo , page, getContext(), tagsAdapter);
fragmentReleasesBinding.progressBar.setVisibility(View.VISIBLE);
}
@@ -6,21 +6,16 @@ import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import org.mian.gitnex.R;
import org.mian.gitnex.actions.CollaboratorActions;
import org.mian.gitnex.actions.PullRequestActions;
import org.mian.gitnex.actions.TeamActions;
import org.mian.gitnex.activities.CreateLabelActivity;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Author M M Arif
* @author M M Arif
*/
public class AlertDialogs {
@@ -80,34 +75,6 @@ public class AlertDialogs {
}
public static void tagDeleteDialog(final Context context, final String tagName, final String owner, final String repo) {
new AlertDialog.Builder(context)
.setTitle(String.format(context.getString(R.string.deleteTagTitle), tagName))
.setMessage(R.string.deleteTagConfirmation)
.setIcon(R.drawable.ic_delete)
.setPositiveButton(R.string.menuDeleteText, (dialog, whichButton) -> RetrofitClient.getApiInterface(context).repoDeleteTag(owner, repo, tagName).enqueue(new Callback<Void>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
if(response.isSuccessful()) {
Toasty.success(context, context.getString(R.string.tagDeleted));
}
else if(response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericError));
}
}))
.setNeutralButton(R.string.cancelButton, null).show();
}
public static void collaboratorRemoveDialog(final Context context, final String userNameMain, RepositoryContext repository) {
new AlertDialog.Builder(context)
@@ -25,8 +25,8 @@ import retrofit2.Response;
public class ReleasesViewModel extends ViewModel {
private static MutableLiveData<List<Release>> releasesList;
private static int resultLimit = Constants.resultLimitOldGiteaInstances;
private MutableLiveData<List<Release>> releasesList;
private int resultLimit = Constants.resultLimitOldGiteaInstances;
public LiveData<List<Release>> getReleasesList(String owner, String repo, Context ctx) {
@@ -42,7 +42,7 @@ public class ReleasesViewModel extends ViewModel {
return releasesList;
}
public static void loadReleasesList(String owner, String repo, Context ctx) {
public void loadReleasesList(String owner, String repo, Context ctx) {
Call<List<Release>> call = RetrofitClient
.getApiInterface(ctx)
@@ -69,7 +69,7 @@ public class ReleasesViewModel extends ViewModel {
});
}
public static void loadMoreReleases(String owner, String repo, int page, Context ctx, ReleasesAdapter adapter) {
public void loadMoreReleases(String owner, String repo, int page, Context ctx, ReleasesAdapter adapter) {
Call<List<Release>> call = RetrofitClient
.getApiInterface(ctx)
@@ -106,7 +106,7 @@ public class ReleasesViewModel extends ViewModel {
});
}
private static MutableLiveData<List<Tag>> tagsList;
private MutableLiveData<List<Tag>> tagsList;
public LiveData<List<Tag>> getTagsList(String owner, String repo, Context ctx) {
@@ -122,7 +122,7 @@ public class ReleasesViewModel extends ViewModel {
return tagsList;
}
public static void loadTagsList(String owner, String repo, Context ctx) {
public void loadTagsList(String owner, String repo, Context ctx) {
Call<List<Tag>> call = RetrofitClient
.getApiInterface(ctx)
@@ -149,7 +149,7 @@ public class ReleasesViewModel extends ViewModel {
});
}
public static void loadMoreTags(String owner, String repo, int page, Context ctx, TagsAdapter adapter) {
public void loadMoreTags(String owner, String repo, int page, Context ctx, TagsAdapter adapter) {
Call<List<Tag>> call = RetrofitClient
.getApiInterface(ctx)
+1
View File
@@ -749,6 +749,7 @@
<string name="deleteTagConfirmation">Do you really want to delete this tag?</string>
<string name="deleteTagTitle">Delete tag %s</string>
<string name="tagDeleted">Tag deleted</string>
<string name="tagDeleteError">A tag attached to a release cannot be deleted directly</string>
<string name="useCustomTabs">Use Custom Tabs</string>
<string name="browserOpenFailed">No application found to open this link. SSH URLs and URLs with another prefix the http:// or https:// are not supported by most browser</string>
<string name="logInAgain">Log in again</string>