diff --git a/app/build.gradle b/app/build.gradle index 95708c04..6e1f7a95 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,6 +10,9 @@ android { versionName "3.0.0-dev" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + viewBinding { + enabled = true + } buildTypes { release { minifyEnabled false @@ -38,7 +41,7 @@ dependencies { def acra = "5.5.0" implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "androidx.appcompat:appcompat:1.2.0-beta01" + implementation "androidx.appcompat:appcompat:1.2.0-rc01" implementation "com.google.android.material:material:1.2.0-alpha06" implementation "androidx.constraintlayout:constraintlayout:1.1.3" implementation "androidx.legacy:legacy-support-v4:1.0.0" @@ -46,15 +49,15 @@ dependencies { androidTestImplementation "androidx.test:runner:1.2.0" androidTestImplementation "androidx.test.espresso:espresso-core:3.2.0" implementation "com.github.vihtarb:tooltip:0.2.0" - implementation 'com.squareup.okhttp3:okhttp:4.5.0' + implementation 'com.squareup.okhttp3:okhttp:4.7.0' implementation "com.google.code.gson:gson:2.8.6" implementation "com.squareup.picasso:picasso:2.71828" implementation "com.amulyakhare:com.amulyakhare.textdrawable:1.0.1" implementation 'com.squareup.retrofit2:retrofit:2.8.1' implementation 'com.squareup.retrofit2:converter-gson:2.8.1' implementation 'com.squareup.retrofit2:converter-scalars:2.8.1' - implementation 'com.squareup.okhttp3:logging-interceptor:4.5.0' - implementation 'org.ocpsoft.prettytime:prettytime:4.0.4.Final' + implementation 'com.squareup.okhttp3:logging-interceptor:4.7.0' + implementation 'org.ocpsoft.prettytime:prettytime:4.0.5.Final' implementation "com.vdurmont:emoji-java:5.1.1" implementation "com.pes.materialcolorpicker:library:1.2.5" implementation "io.noties.markwon:core:$markwon_version" diff --git a/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java b/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java index ed8879ec..8cc14121 100644 --- a/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java @@ -2,24 +2,19 @@ package org.mian.gitnex.activities; import android.annotation.SuppressLint; import android.content.Context; -import android.graphics.drawable.GradientDrawable; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.Spinner; -import android.widget.TextView; import androidx.annotation.NonNull; +import com.google.gson.JsonElement; import com.hendraanggrian.appcompat.socialview.Mention; import com.hendraanggrian.appcompat.widget.MentionArrayAdapter; -import com.hendraanggrian.appcompat.widget.SocialAutoCompleteTextView; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.databinding.ActivityMergePullRequestBinding; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Toasty; @@ -42,17 +37,12 @@ import retrofit2.Response; public class MergePullRequestActivity extends BaseActivity { - public ImageView closeActivity; private View.OnClickListener onClickListener; - final Context ctx = this; private Context appCtx; + private ActivityMergePullRequestBinding viewBinding; - private SocialAutoCompleteTextView mergeDescription; - private EditText mergeTitle; - private Spinner mergeModeSpinner; private ArrayAdapter defaultMentionAdapter; - private Button mergeButton; private String Do; @Override @@ -68,22 +58,22 @@ public class MergePullRequestActivity extends BaseActivity { super.onCreate(savedInstanceState); appCtx = getApplicationContext(); + viewBinding = ActivityMergePullRequestBinding.inflate(getLayoutInflater()); + View view = viewBinding.getRoot(); + setContentView(view); + boolean connToInternet = AppUtil.haveNetworkConnection(appCtx); TinyDB tinyDb = new TinyDB(appCtx); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - mergeModeSpinner = findViewById(R.id.mergeSpinner); - mergeDescription = findViewById(R.id.mergeDescription); - mergeTitle = findViewById(R.id.mergeTitle); - - mergeTitle.requestFocus(); + viewBinding.mergeTitle.requestFocus(); assert imm != null; - imm.showSoftInput(mergeTitle, InputMethodManager.SHOW_IMPLICIT); + imm.showSoftInput(viewBinding.mergeTitle, InputMethodManager.SHOW_IMPLICIT); setMergeAdapter(); - mergeModeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + viewBinding.mergeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { @@ -103,20 +93,35 @@ public class MergePullRequestActivity extends BaseActivity { defaultMentionAdapter = new MentionArrayAdapter<>(this); loadCollaboratorsList(); - mergeDescription.setMentionAdapter(defaultMentionAdapter); - - closeActivity = findViewById(R.id.close); - TextView toolbar_title = findViewById(R.id.toolbar_title); + viewBinding.mergeDescription.setMentionAdapter(defaultMentionAdapter); if(!tinyDb.getString("issueTitle").isEmpty()) { - toolbar_title.setText(tinyDb.getString("issueTitle")); - mergeTitle.setText(tinyDb.getString("issueTitle") + " (#" + tinyDb.getString("issueNumber") + ")"); + viewBinding.toolbarTitle.setText(tinyDb.getString("issueTitle")); + viewBinding.mergeTitle.setText(tinyDb.getString("issueTitle") + " (#" + tinyDb.getString("issueNumber") + ")"); } initCloseListener(); - closeActivity.setOnClickListener(onClickListener); + viewBinding.close.setOnClickListener(onClickListener); - mergeButton = findViewById(R.id.mergeButton); + // if gitea version is greater/equal(1.12.0) than user installed version (installed.higherOrEqual(compareVer)) + if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { + viewBinding.deleteBranch.setVisibility(View.VISIBLE); + } + + if(tinyDb.getString("prMergeable").equals("false")) { + disableProcessButton(); + viewBinding.mergeInfoDisabledMessage.setVisibility(View.VISIBLE); + } + else { + viewBinding.mergeInfoDisabledMessage.setVisibility(View.GONE); + } + + if(tinyDb.getString("prIsFork").equals("true")) { + viewBinding.deleteBranchForkInfo.setVisibility(View.VISIBLE); + } + else { + viewBinding.deleteBranchForkInfo.setVisibility(View.GONE); + } if(!connToInternet) { @@ -125,7 +130,7 @@ public class MergePullRequestActivity extends BaseActivity { } else { - mergeButton.setOnClickListener(mergePullRequest); + viewBinding.mergeButton.setOnClickListener(mergePullRequest); } @@ -140,14 +145,14 @@ public class MergePullRequestActivity extends BaseActivity { mergeList.add(new MergePullRequestSpinner("merge", getResources().getString(R.string.mergeOptionMerge))); mergeList.add(new MergePullRequestSpinner("rebase", getResources().getString(R.string.mergeOptionRebase))); mergeList.add(new MergePullRequestSpinner("rebase-merge", getResources().getString(R.string.mergeOptionRebaseCommit))); - //squash merge works only on gitea > v1.11.4 due to a bug + // squash merge works only on gitea > v1.11.4 due to a bug if(new Version(tinyDb.getString("giteaVersion")).higher("1.11.4")) { mergeList.add(new MergePullRequestSpinner("squash", getResources().getString(R.string.mergeOptionSquash))); } ArrayAdapter adapter = new ArrayAdapter<>(MergePullRequestActivity.this, R.layout.spinner_item, mergeList); adapter.setDropDownViewResource(R.layout.spinner_dropdown_item); - mergeModeSpinner.setAdapter(adapter); + viewBinding.mergeSpinner.setAdapter(adapter); } @@ -208,8 +213,9 @@ public class MergePullRequestActivity extends BaseActivity { private void processMergePullRequest() { - String mergePRDesc = mergeDescription.getText().toString(); - String mergePRTitle = mergeTitle.getText().toString(); + String mergePRDesc = viewBinding.mergeDescription.getText().toString(); + String mergePRTitle = viewBinding.mergeTitle.getText().toString(); + boolean deleteBranch = viewBinding.deleteBranch.isChecked(); boolean connToInternet = AppUtil.haveNetworkConnection(appCtx); @@ -221,11 +227,11 @@ public class MergePullRequestActivity extends BaseActivity { } disableProcessButton(); - mergeFunction(Do, mergePRDesc, mergePRTitle); + mergeFunction(Do, mergePRDesc, mergePRTitle, deleteBranch); } - private void mergeFunction(String Do, String mergePRDT, String mergeTitle) { + private void mergeFunction(String Do, String mergePRDT, String mergeTitle, boolean deleteBranch) { final TinyDB tinyDb = new TinyDB(appCtx); @@ -249,10 +255,48 @@ public class MergePullRequestActivity extends BaseActivity { if(response.code() == 200) { - Toasty.info(ctx, getString(R.string.mergePRSuccessMsg)); - tinyDb.putBoolean("prMerged", true); - tinyDb.putBoolean("resumePullRequests", true); - finish(); + if(deleteBranch) { + + if(tinyDb.getString("prIsFork").equals("true")) { + + String repoFullName = tinyDb.getString("prForkFullName"); + String[] parts = repoFullName.split("/"); + final String repoOwner = parts[0]; + final String repoName = parts[1]; + + deleteBranchFunction(repoOwner, repoName); + + Toasty.info(ctx, getString(R.string.mergePRSuccessMsg)); + tinyDb.putBoolean("prMerged", true); + tinyDb.putBoolean("resumePullRequests", true); + finish(); + + } + else { + + String repoFullName = tinyDb.getString("repoFullName"); + String[] parts = repoFullName.split("/"); + final String repoOwner = parts[0]; + final String repoName = parts[1]; + + deleteBranchFunction(repoOwner, repoName); + + Toasty.info(ctx, getString(R.string.mergePRSuccessMsg)); + tinyDb.putBoolean("prMerged", true); + tinyDb.putBoolean("resumePullRequests", true); + finish(); + + } + + } + else { + + Toasty.info(ctx, getString(R.string.mergePRSuccessMsg)); + tinyDb.putBoolean("prMerged", true); + tinyDb.putBoolean("resumePullRequests", true); + finish(); + + } } else if(response.code() == 401) { @@ -287,23 +331,56 @@ public class MergePullRequestActivity extends BaseActivity { } + private void deleteBranchFunction(String repoOwner, String repoName) { + + TinyDB tinyDb = new TinyDB(appCtx); + + String instanceUrl = tinyDb.getString("instanceUrl"); + String loginUid = tinyDb.getString("loginUid"); + String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + String branchName = tinyDb.getString("prHeadBranch"); + + Call call = RetrofitClient + .getInstance(instanceUrl, ctx) + .getApiInterface() + .deleteBranch(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, branchName); + + call.enqueue(new Callback() { + + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + + if(response.code() == 204) { + + Log.i("deleteBranch", "Branch deleted successfully"); + + } + + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + Log.e("onFailure", t.toString()); + enableProcessButton(); + + } + + }); + + } + private void disableProcessButton() { - mergeButton.setEnabled(false); - GradientDrawable shape = new GradientDrawable(); - shape.setCornerRadius(8); - shape.setColor(getResources().getColor(R.color.hintColor)); - mergeButton.setBackground(shape); + viewBinding.mergeButton.setEnabled(false); + viewBinding.mergeButton.setBackground(getResources().getDrawable(R.drawable.shape_buttons_disabled)); } private void enableProcessButton() { - mergeButton.setEnabled(true); - GradientDrawable shape = new GradientDrawable(); - shape.setCornerRadius(8); - shape.setColor(getResources().getColor(R.color.btnBackground)); - mergeButton.setBackground(shape); + viewBinding.mergeButton.setEnabled(true); + viewBinding.mergeButton.setBackground(getResources().getDrawable(R.drawable.shape_buttons)); } diff --git a/app/src/main/java/org/mian/gitnex/adapters/PullRequestsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/PullRequestsAdapter.java index d5c8ba76..992f0184 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/PullRequestsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/PullRequestsAdapter.java @@ -97,6 +97,10 @@ public class PullRequestsAdapter extends RecyclerView.Adapter removeTeamMember(@Header("Authorization") String token, @Path("teamId") int teamId, @Path("username") String username); + + @DELETE("repos/{owner}/{repo}/branches/{branch}") // delete branch + Call deleteBranch(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Path("branch") String branchName); } diff --git a/app/src/main/java/org/mian/gitnex/models/PullRequests.java b/app/src/main/java/org/mian/gitnex/models/PullRequests.java index 7c5573a1..d7e0d5ab 100644 --- a/app/src/main/java/org/mian/gitnex/models/PullRequests.java +++ b/app/src/main/java/org/mian/gitnex/models/PullRequests.java @@ -42,7 +42,7 @@ public class PullRequests { this.body = body; } - public class headObject { + public static class headObject { private int repo_id; private String label; @@ -51,7 +51,7 @@ public class PullRequests { private repoObject repo; - public class repoObject { + public static class repoObject { private int repo_id; private boolean allow_merge_commits; @@ -91,7 +91,7 @@ public class PullRequests { private ownerObject owner; private permissionsObject permissions; - public class ownerObject { + public static class ownerObject { private int repo_id; private boolean is_admin; @@ -135,7 +135,7 @@ public class PullRequests { } } - public class permissionsObject { + public static class permissionsObject { private boolean admin; private boolean pull; @@ -295,9 +295,34 @@ public class PullRequests { } } + public int getRepo_id() { + + return repo_id; + } + + public String getLabel() { + + return label; + } + + public String getRef() { + + return ref; + } + + public String getSha() { + + return sha; + } + + public repoObject getRepo() { + + return repo; + } + } - public class baseObject { + public static class baseObject { private int repo_id; private String label; @@ -306,7 +331,7 @@ public class PullRequests { private repoObject repo; - public class repoObject { + public static class repoObject { private int repo_id; private boolean allow_merge_commits; @@ -344,7 +369,7 @@ public class PullRequests { private ownerObject owner; private permissionsObject permissions; - public class ownerObject { + public static class ownerObject { private int repo_id; private boolean is_admin; @@ -388,7 +413,7 @@ public class PullRequests { } } - public class permissionsObject { + public static class permissionsObject { private boolean admin; private boolean pull; @@ -540,9 +565,34 @@ public class PullRequests { } } + public int getRepo_id() { + + return repo_id; + } + + public String getLabel() { + + return label; + } + + public String getRef() { + + return ref; + } + + public String getSha() { + + return sha; + } + + public repoObject getRepo() { + + return repo; + } + } - public class userObject { + public static class userObject { private int id; private String login; @@ -581,7 +631,7 @@ public class PullRequests { } } - public class labelsObject { + public static class labelsObject { private int id; private String name; @@ -605,7 +655,7 @@ public class PullRequests { } } - public class assigneesObject { + public static class assigneesObject { private int id; private String login; @@ -644,7 +694,7 @@ public class PullRequests { } } - public class mergedByObject { + public static class mergedByObject { private int id; private String login; @@ -683,7 +733,7 @@ public class PullRequests { } } - public class milestoneObject { + public static class milestoneObject { private int id; private String title; diff --git a/app/src/main/res/drawable/shape_buttons.xml b/app/src/main/res/drawable/shape_buttons.xml index 66338831..69f73cf3 100644 --- a/app/src/main/res/drawable/shape_buttons.xml +++ b/app/src/main/res/drawable/shape_buttons.xml @@ -1,21 +1,39 @@ - + - - + - - + - - + + - \ No newline at end of file + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_buttons_disabled.xml b/app/src/main/res/drawable/shape_buttons_disabled.xml new file mode 100644 index 00000000..73c41fdc --- /dev/null +++ b/app/src/main/res/drawable/shape_buttons_disabled.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_merge_pull_request.xml b/app/src/main/res/layout/activity_merge_pull_request.xml index 0b6356c3..bdf90f3f 100644 --- a/app/src/main/res/layout/activity_merge_pull_request.xml +++ b/app/src/main/res/layout/activity_merge_pull_request.xml @@ -123,6 +123,27 @@ + + + + + android:layout_marginTop="15dp" />