diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java index b5db546b..b4cd679d 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java @@ -94,8 +94,9 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis final String repoName = parts[1]; final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - // if gitea is 1.12 or higher use the new limit + // require gitea 1.12 or higher if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { + resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances; } diff --git a/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java b/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java index 7d8d6262..d6dff0b5 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java @@ -17,8 +17,11 @@ import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.databinding.ActivityRepositorySettingsBinding; import org.mian.gitnex.databinding.CustomRepositoryDeleteDialogBinding; import org.mian.gitnex.databinding.CustomRepositoryEditPropertiesDialogBinding; +import org.mian.gitnex.databinding.CustomRepositoryTransferDialogBinding; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.models.RepositoryTransfer; import org.mian.gitnex.models.UserRepositories; import retrofit2.Call; import retrofit2.Callback; @@ -32,8 +35,10 @@ public class RepositorySettingsActivity extends BaseActivity { private ActivityRepositorySettingsBinding viewBinding; private CustomRepositoryEditPropertiesDialogBinding propBinding; private CustomRepositoryDeleteDialogBinding deleteRepoBinding; + private CustomRepositoryTransferDialogBinding transferRepoBinding; private Dialog dialogProp; private Dialog dialogDeleteRepository; + private Dialog dialogTransferRepository; private View.OnClickListener onClickListener; private Context ctx = this; private Context appCtx; @@ -75,14 +80,116 @@ public class RepositorySettingsActivity extends BaseActivity { initCloseListener(); closeActivity.setOnClickListener(onClickListener); + // require gitea 1.12 or higher + if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { + + viewBinding.transferOwnerFrame.setVisibility(View.VISIBLE); + } + viewBinding.editProperties.setOnClickListener(editProperties -> { showRepositoryProperties(); }); - viewBinding.deleteRepository.setOnClickListener(editProperties -> { + viewBinding.deleteRepository.setOnClickListener(deleteRepository -> { showDeleteRepository(); }); + viewBinding.transferOwnerFrame.setOnClickListener(transferRepositoryOwnership -> { + showTransferRepository(); + }); + + } + + private void showTransferRepository() { + + dialogTransferRepository = new Dialog(ctx, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert); + + if (dialogTransferRepository.getWindow() != null) { + + dialogTransferRepository.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + } + + transferRepoBinding = CustomRepositoryTransferDialogBinding.inflate(LayoutInflater.from(ctx)); + + View view = transferRepoBinding.getRoot(); + dialogTransferRepository.setContentView(view); + + transferRepoBinding.cancel.setOnClickListener(editProperties -> { + dialogTransferRepository.dismiss(); + }); + + transferRepoBinding.transfer.setOnClickListener(deleteRepo -> { + + String newOwner = String.valueOf(transferRepoBinding.ownerNameForTransfer.getText()); + String repoName = String.valueOf(transferRepoBinding.repoNameForTransfer.getText()); + + if(!repositoryName.equals(repoName)) { + + Toasty.error(ctx, getString(R.string.repoSettingsDeleteError)); + } + else if(newOwner.matches("")) { + + Toasty.error(ctx, getString(R.string.repoTransferOwnerError)); + } + else { + + transferRepository(newOwner); + } + }); + + dialogTransferRepository.show(); + } + + private void transferRepository(String newOwner) { + + RepositoryTransfer repositoryTransfer = new RepositoryTransfer(newOwner); + + Call transferCall = RetrofitClient + .getInstance(instanceUrl, ctx) + .getApiInterface() + .transferRepository(instanceToken, repositoryOwner, repositoryName, repositoryTransfer); + + transferCall.enqueue(new Callback() { + + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + + transferRepoBinding.transfer.setVisibility(View.GONE); + transferRepoBinding.processingRequest.setVisibility(View.VISIBLE); + + if (response.code() == 202) { + + dialogTransferRepository.dismiss(); + Toasty.success(ctx, getString(R.string.repoTransferSuccess)); + + finish(); + RepositoriesApi.deleteRepository((int) tinyDb.getLong("repositoryId", 0)); + Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class); + RepositorySettingsActivity.this.startActivity(intent); + } + else if (response.code() == 404) { + + transferRepoBinding.transfer.setVisibility(View.VISIBLE); + transferRepoBinding.processingRequest.setVisibility(View.GONE); + Toasty.error(ctx, getString(R.string.repoTransferError)); + } + else { + + transferRepoBinding.transfer.setVisibility(View.VISIBLE); + transferRepoBinding.processingRequest.setVisibility(View.GONE); + Toasty.error(ctx, getString(R.string.genericError)); + } + + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + transferRepoBinding.transfer.setVisibility(View.VISIBLE); + transferRepoBinding.processingRequest.setVisibility(View.GONE); + Toasty.error(ctx, getString(R.string.genericServerResponseError)); + } + }); } private void showDeleteRepository() { @@ -144,6 +251,8 @@ public class RepositorySettingsActivity extends BaseActivity { } else { + deleteRepoBinding.delete.setVisibility(View.VISIBLE); + deleteRepoBinding.processingRequest.setVisibility(View.GONE); Toasty.error(ctx, getString(R.string.genericError)); } @@ -152,6 +261,8 @@ public class RepositorySettingsActivity extends BaseActivity { @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { + deleteRepoBinding.delete.setVisibility(View.VISIBLE); + deleteRepoBinding.processingRequest.setVisibility(View.GONE); Toasty.error(ctx, getString(R.string.genericServerResponseError)); } }); @@ -297,6 +408,8 @@ public class RepositorySettingsActivity extends BaseActivity { } else { + propBinding.save.setVisibility(View.VISIBLE); + propBinding.processingRequest.setVisibility(View.GONE); Toasty.error(ctx, getString(R.string.genericError)); } @@ -305,6 +418,8 @@ public class RepositorySettingsActivity extends BaseActivity { @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { + propBinding.save.setVisibility(View.VISIBLE); + propBinding.processingRequest.setVisibility(View.GONE); Toasty.error(ctx, getString(R.string.genericServerResponseError)); } }); diff --git a/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java b/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java index 34c1457a..6d109af7 100644 --- a/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java +++ b/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java @@ -26,6 +26,7 @@ import org.mian.gitnex.models.OrganizationRepository; import org.mian.gitnex.models.Permission; import org.mian.gitnex.models.PullRequests; import org.mian.gitnex.models.Releases; +import org.mian.gitnex.models.RepositoryTransfer; import org.mian.gitnex.models.Teams; import org.mian.gitnex.models.UpdateIssueAssignees; import org.mian.gitnex.models.UpdateIssueState; @@ -133,6 +134,9 @@ public interface ApiInterface { @DELETE("repos/{owner}/{repo}") // delete repository Call deleteRepository(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName); + @POST("repos/{owner}/{repo}/transfer") // transfer repository + Call transferRepository(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Body RepositoryTransfer jsonStr); + @GET("repos/{owner}/{repo}/issues") // get issues by repo Call> getIssues(@Header("Authorization") String token, @Path("owner") String owner, @Path("repo") String repo, @Query("page") int page, @Query("limit") int limit, @Query("type") String requestType, @Query("state") String issueState); diff --git a/app/src/main/java/org/mian/gitnex/models/RepositoryTransfer.java b/app/src/main/java/org/mian/gitnex/models/RepositoryTransfer.java new file mode 100644 index 00000000..248dffb6 --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/models/RepositoryTransfer.java @@ -0,0 +1,20 @@ +package org.mian.gitnex.models; + +/** + * Author M M Arif + */ + +public class RepositoryTransfer { + + private String new_owner; + + public RepositoryTransfer(String new_owner) { + + this.new_owner = new_owner; + } + + public String getNew_owner() { + + return new_owner; + } +} diff --git a/app/src/main/res/layout/activity_repository_settings.xml b/app/src/main/res/layout/activity_repository_settings.xml index d84f016c..df1db7d9 100644 --- a/app/src/main/res/layout/activity_repository_settings.xml +++ b/app/src/main/res/layout/activity_repository_settings.xml @@ -68,6 +68,46 @@ android:layout_height="1dp" android:background="?attr/dividerColor" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +