diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java index 9f4cf680..cf99972c 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java @@ -91,7 +91,7 @@ public class CreateFileActivity extends BaseActivity { filePath = getIntent().getStringExtra("filePath"); fileSha = getIntent().getStringExtra("fileSha"); - toolbarTitle.setText(getString(R.string.deleteFileText, filePath)); + toolbarTitle.setText(getString(R.string.deleteGenericTitle, filePath)); binding.newFileCreate.setText(R.string.deleteFile); diff --git a/app/src/main/java/org/mian/gitnex/adapters/ReleasesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/ReleasesAdapter.java index bcfc4e70..9e798066 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/ReleasesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/ReleasesAdapter.java @@ -10,21 +10,30 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.bottomsheet.BottomSheetDialog; import org.gitnex.tea4j.v2.models.Release; import org.mian.gitnex.R; +import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.activities.ProfileActivity; +import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.clients.PicassoService; +import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.Markdown; import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.structs.FragmentRefreshListener; import java.util.List; import java.util.Locale; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; /** * @author M M Arif @@ -34,12 +43,14 @@ public class ReleasesAdapter extends RecyclerView.Adapter releasesList; private final Context context; + private final String repoOwner; + private final String repoName; private OnLoadMoreListener loadMoreListener; private boolean isLoading = false, isMoreDataAvailable = true; private final FragmentRefreshListener startDownload; - static class ReleasesViewHolder extends RecyclerView.ViewHolder { + class ReleasesViewHolder extends RecyclerView.ViewHolder { private Release releases; @@ -56,6 +67,7 @@ public class ReleasesAdapter extends RecyclerView.Adapter { + final Context context = v.getContext(); + + @SuppressLint("InflateParams") + View view = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_release_in_list, null); + + TextView deleteRelease = view.findViewById(R.id.deleteRelease); + + BottomSheetDialog dialog = new BottomSheetDialog(context); + dialog.setContentView(view); + dialog.show(); + + deleteRelease.setOnClickListener(v1 -> { + deleteRelease(context, releases.getName(), releases.getId(), repoOwner, repoName, getBindingAdapterPosition()); + dialog.dismiss(); + }); + }); } } - public ReleasesAdapter(Context ctx, List releasesMain, FragmentRefreshListener startDownload) { + public ReleasesAdapter(Context ctx, List releasesMain, FragmentRefreshListener startDownload, String repoOwner, String repoName) { this.context = ctx; this.releasesList = releasesMain; this.startDownload = startDownload; + this.repoOwner = repoOwner; + this.repoName = repoName; } @NonNull @@ -178,6 +211,10 @@ public class ReleasesAdapter extends RecyclerView.Adapter RetrofitClient + .getApiInterface(context).repoDeleteRelease(owner, repo, releaseId).enqueue(new Callback<>() { + + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + + if(response.isSuccessful()) { + updateAdapter(position); + Toasty.success(context, context.getString(R.string.releaseDeleted)); + MainActivity.repoCreated = true; + } + 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 call, @NonNull Throwable t) { + + Toasty.error(context, context.getString(R.string.genericError)); + } + })) + .setNeutralButton(R.string.cancelButton, null).show(); + } } diff --git a/app/src/main/java/org/mian/gitnex/adapters/TagsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/TagsAdapter.java index 7f14bd1d..25a88ab9 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/TagsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/TagsAdapter.java @@ -183,7 +183,7 @@ public class TagsAdapter extends RecyclerView.Adapter RetrofitClient diff --git a/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java index 53b08dca..f0a23db4 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java @@ -41,6 +41,7 @@ import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.List; +import java.util.Objects; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.X509TrustManager; @@ -128,7 +129,7 @@ public class ReleasesFragment extends Fragment { releasesModel.getReleasesList(owner, repo, getContext()).observe(getViewLifecycleOwner(), releasesListMain -> { if(!repository.isReleasesViewTypeIsTag()) { - adapter = new ReleasesAdapter(getContext(), releasesListMain, this::requestFileDownload); + adapter = new ReleasesAdapter(getContext(), releasesListMain, this::requestFileDownload, repository.getOwner(), repository.getName()); adapter.setLoadMoreListener(new ReleasesAdapter.OnLoadMoreListener() { @Override @@ -270,7 +271,7 @@ public class ReleasesFragment extends Fragment { OutputStream outputStream = requireContext().getContentResolver().openOutputStream(result.getData().getData()); - AppUtil.copyProgress(response.body().byteStream(), outputStream, 0, p -> {}); + AppUtil.copyProgress(Objects.requireNonNull(response.body()).byteStream(), outputStream, 0, p -> {}); builder.setContentTitle(getString(R.string.fileViewerNotificationTitleFinished)) .setContentText(getString(R.string.fileViewerNotificationDescriptionFinished, Uri.parse(currentDownloadUrl).getLastPathSegment())).setOngoing(false); diff --git a/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java b/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java index b5a2d7f6..1a457b0d 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java @@ -57,7 +57,7 @@ public class AlertDialogs { RepositoryContext repository) { new AlertDialog.Builder(context) - .setTitle(context.getString(R.string.deleteLabelTitle, labelTitle)) + .setTitle(context.getString(R.string.deleteGenericTitle, labelTitle)) .setMessage(R.string.labelDeleteMessage) .setIcon(R.drawable.ic_delete) .setPositiveButton(R.string.menuDeleteText, (dialog, whichButton) -> { diff --git a/app/src/main/res/layout/bottom_sheet_release_in_list.xml b/app/src/main/res/layout/bottom_sheet_release_in_list.xml new file mode 100644 index 00000000..99723f19 --- /dev/null +++ b/app/src/main/res/layout/bottom_sheet_release_in_list.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_releases.xml b/app/src/main/res/layout/list_releases.xml index 554f867b..1c206db8 100644 --- a/app/src/main/res/layout/list_releases.xml +++ b/app/src/main/res/layout/list_releases.xml @@ -29,16 +29,15 @@ android:textSize="16sp" android:textStyle="bold" /> - + android:layout_gravity="center_vertical|end" + android:contentDescription="@string/labelMenuContentDesc" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:src="@drawable/ic_dotted_menu_horizontal" /> @@ -77,6 +76,25 @@ android:gravity="end" android:orientation="vertical"> + + + + + + Authorization Error It seems that the Access Token is revoked OR your are not allowed to see these contents.\n\nIn case of revoked Token, please logout and login again - Delete %s Do you really want to delete this label? @@ -404,6 +403,8 @@ Tag name is empty Title is empty New release created + Do you really want to delete this release? + Release deleted OTP code should be numbers @@ -506,6 +507,7 @@ Download Reopen Open in Browser + Delete %s Explore users @@ -561,7 +563,6 @@ This file type/size is not supported in file viewer. You can download it from the menu. Delete This File Edit This File - Delete %1$s File is set for deletion by branch %1$s Edit %1$s File is modified by branch %1$s @@ -750,7 +751,7 @@ Tag created Use as reference Do you really want to delete this tag? - Delete tag %s + Tag deleted A tag attached to a release cannot be deleted directly Use Custom Tabs