diff --git a/README.md b/README.md index e6ac43f6..1de15309 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,6 @@ Thanks to all the open source libraries, contributors and donators. - Amulyakhare/textdrawable - Vdurmont/emoji-java - Pes/materialcolorpicker -- Hendraanggrian/socialview - HamidrezaAmz/BreadcrumbsView - Chrisbanes/PhotoView - Pddstudio/highlightjs-android diff --git a/app/build.gradle b/app/build.gradle index 54a3b468..38e55434 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,10 +60,10 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.3.0-alpha02' implementation 'com.google.android.material:material:1.3.0-alpha03' - implementation 'androidx.constraintlayout:constraintlayout:2.0.1' + implementation 'androidx.constraintlayout:constraintlayout:2.0.2' implementation "androidx.legacy:legacy-support-v4:1.0.0" implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" - testImplementation "junit:junit:4.13" + testImplementation 'junit:junit:4.13.1' androidTestImplementation 'androidx.test:runner:1.3.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' @@ -92,8 +92,6 @@ dependencies { implementation "io.noties.markwon:syntax-highlight:$markwon_version" implementation "com.caverock:androidsvg:1.4" implementation "pl.droidsonroids.gif:android-gif-drawable:1.2.19" - implementation "com.hendraanggrian.appcompat:socialview:0.2" - implementation "com.hendraanggrian.appcompat:socialview-commons:0.2" implementation "com.github.HamidrezaAmz:BreadcrumbsView:0.2.9" implementation "commons-io:commons-io:20030203.000550" implementation 'org.apache.commons:commons-lang3:3.11' diff --git a/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java b/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java index f438f4db..927b040e 100644 --- a/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java @@ -63,7 +63,7 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity { ImageView closeActivity = findViewById(R.id.close); addCollaboratorSearch = findViewById(R.id.addCollaboratorSearch); mRecyclerView = findViewById(R.id.recyclerViewUserSearch); - mProgressBar = findViewById(R.id.progress_bar); + mProgressBar = findViewById(R.id.progressBar); noData = findViewById(R.id.noData); addCollaboratorSearch.requestFocus(); @@ -76,7 +76,10 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity { addCollaboratorSearch.setOnEditorActionListener((v, actionId, event) -> { if (actionId == EditorInfo.IME_ACTION_SEND) { + if(!addCollaboratorSearch.getText().toString().equals("")) { + + mProgressBar.setVisibility(View.VISIBLE); loadUserSearchList(instanceUrl, instanceToken, addCollaboratorSearch.getText().toString(), loginUid); } } @@ -99,10 +102,15 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { - if (response.isSuccessful()) { + mProgressBar.setVisibility(View.GONE); + + if (response.code() == 200) { + assert response.body() != null; getUsersList(response.body().getData(), ctx); - } else { + } + else { + Log.i("onResponse", String.valueOf(response.code())); } @@ -129,11 +137,13 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity { mProgressBar.setVisibility(View.VISIBLE); if(adapter.getItemCount() > 0) { + mRecyclerView.setAdapter(adapter); noData.setVisibility(View.GONE); mProgressBar.setVisibility(View.GONE); } else { + noData.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.GONE); } 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 0e6c74ad..edfd8c31 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java @@ -5,12 +5,11 @@ 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.AutoCompleteTextView; 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; @@ -44,7 +43,7 @@ public class CreateFileActivity extends BaseActivity { private EditText newFileContent; private EditText newFileBranchName; private EditText newFileCommitMessage; - private Spinner newFileBranchesSpinner; + private AutoCompleteTextView newFileBranchesSpinner; private String filePath; private String fileSha; private int fileAction = 0; // 0 = create, 1 = delete, 2 = edit @@ -54,6 +53,14 @@ public class CreateFileActivity extends BaseActivity { List branchesList = new ArrayList<>(); + private String instanceUrl; + private String loginUid; + private String repoOwner; + private String repoName; + private String instanceToken; + + private String selectedBranch; + @Override protected int getLayoutResourceId(){ return R.layout.activity_new_file; @@ -70,23 +77,20 @@ public class CreateFileActivity extends BaseActivity { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); + instanceUrl = tinyDb.getString("instanceUrl"); + loginUid = tinyDb.getString("loginUid"); String repoFullName = tinyDb.getString("repoFullName"); String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + repoOwner = parts[0]; + repoName = parts[1]; + instanceToken = "token " + tinyDb.getString(loginUid + "-token"); closeActivity = findViewById(R.id.close); newFileName = findViewById(R.id.newFileName); newFileContent = findViewById(R.id.newFileContent); newFileBranchName = findViewById(R.id.newFileBranchName); newFileCommitMessage = findViewById(R.id.newFileCommitMessage); - TextView branchNameId = findViewById(R.id.branchNameId); - TextView branchNameHintText = findViewById(R.id.branchNameHintText); TextView toolbarTitle = findViewById(R.id.toolbarTitle); - TextView fileNameHint = findViewById(R.id.fileNameHint); newFileName.requestFocus(); assert imm != null; @@ -99,7 +103,6 @@ public class CreateFileActivity extends BaseActivity { if(getIntent().getStringExtra("filePath") != null && getIntent().getIntExtra("fileAction", 1) == 1) { - fileNameHint.setVisibility(View.GONE); fileAction = getIntent().getIntExtra("fileAction", 1); filePath = getIntent().getStringExtra("filePath"); @@ -120,7 +123,6 @@ public class CreateFileActivity extends BaseActivity { if(getIntent().getStringExtra("filePath") != null && getIntent().getIntExtra("fileAction", 2) == 2) { - fileNameHint.setVisibility(View.GONE); fileAction = getIntent().getIntExtra("fileAction", 2); filePath = getIntent().getStringExtra("filePath"); @@ -143,32 +145,6 @@ public class CreateFileActivity extends BaseActivity { newFileBranchesSpinner = findViewById(R.id.newFileBranchesSpinner); getBranches(instanceUrl, instanceToken, repoOwner, repoName, loginUid); - newFileBranchesSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() - { - public void onItemSelected(AdapterView arg0, - View arg1, int arg2, long arg3) - { - Branches bModelValue = (Branches) newFileBranchesSpinner.getSelectedItem(); - - if(bModelValue.toString().equals("No branch")) { - newFileBranchName.setEnabled(true); - newFileBranchName.setVisibility(View.VISIBLE); - branchNameId.setVisibility(View.VISIBLE); - branchNameHintText.setVisibility(View.VISIBLE); - } - else { - newFileBranchName.setEnabled(false); - newFileBranchName.setVisibility(View.GONE); - branchNameId.setVisibility(View.GONE); - branchNameHintText.setVisibility(View.GONE); - newFileBranchName.setText(""); - } - - } - - public void onNothingSelected(AdapterView arg0) {} - }); - disableProcessButton(); if(!connToInternet) { @@ -188,37 +164,27 @@ public class CreateFileActivity extends BaseActivity { boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); AppUtil appUtil = new AppUtil(); - TinyDB tinyDb = new TinyDB(appCtx); - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; String newFileName_ = newFileName.getText().toString(); String newFileContent_ = newFileContent.getText().toString(); String newFileBranchName_ = newFileBranchName.getText().toString(); String newFileCommitMessage_ = newFileCommitMessage.getText().toString(); - Branches currentBranch = (Branches) newFileBranchesSpinner.getSelectedItem(); + //Branches currentBranch = (Branches) newFileBranchesSpinner.getSelectedItem(); if(!connToInternet) { Toasty.error(ctx, getResources().getString(R.string.checkNetConnection)); return; - } if(newFileName_.equals("") || newFileContent_.equals("") || newFileCommitMessage_.equals("")) { Toasty.error(ctx, getString(R.string.newFileRequiredFields)); return; - } - if(currentBranch.toString().equals("No branch")) { + if(selectedBranch.equals("No branch")) { if(newFileBranchName_.equals("")) { Toasty.error(ctx, getString(R.string.newFileRequiredFieldNewBranchName)); @@ -229,7 +195,6 @@ public class CreateFileActivity extends BaseActivity { Toasty.error(ctx, getString(R.string.newFileInvalidBranchName)); return; - } } @@ -238,7 +203,6 @@ public class CreateFileActivity extends BaseActivity { if(appUtil.charactersLength(newFileCommitMessage_) > 255) { Toasty.warning(ctx, getString(R.string.newFileCommitMessageError)); - } else { @@ -247,17 +211,17 @@ public class CreateFileActivity extends BaseActivity { if(fileAction == 1) { deleteFile(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, filePath, - newFileBranchName_, newFileCommitMessage_, currentBranch.toString(), fileSha); + newFileBranchName_, newFileCommitMessage_, selectedBranch, fileSha); } else if(fileAction == 2) { editFile(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, filePath, - appUtil.encodeBase64(newFileContent_), newFileBranchName_, newFileCommitMessage_, currentBranch.toString(), fileSha); + appUtil.encodeBase64(newFileContent_), newFileBranchName_, newFileCommitMessage_, selectedBranch, fileSha); } else { createNewFile(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, newFileName_, - appUtil.encodeBase64(newFileContent_), newFileBranchName_, newFileCommitMessage_, currentBranch.toString()); + appUtil.encodeBase64(newFileContent_), newFileBranchName_, newFileCommitMessage_, selectedBranch); } } @@ -268,9 +232,11 @@ public class CreateFileActivity extends BaseActivity { NewFile createNewFileJsonStr; if(currentBranch.equals("No branch")) { + createNewFileJsonStr = new NewFile("", fileContent, fileCommitMessage, fileBranchName); } else { + createNewFileJsonStr = new NewFile(currentBranch, fileContent, fileCommitMessage, ""); } @@ -358,7 +324,6 @@ public class CreateFileActivity extends BaseActivity { getIntent().removeExtra("fileSha"); getIntent().removeExtra("fileContents"); finish(); - } else if(response.code() == 401) { @@ -367,7 +332,6 @@ public class CreateFileActivity extends BaseActivity { getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); - } else { @@ -430,7 +394,6 @@ public class CreateFileActivity extends BaseActivity { getIntent().removeExtra("fileContents"); tinyDb.putBoolean("fileModified", true); finish(); - } else if(response.code() == 401) { @@ -439,7 +402,6 @@ public class CreateFileActivity extends BaseActivity { getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); - } else { @@ -499,12 +461,29 @@ public class CreateFileActivity extends BaseActivity { } ArrayAdapter adapter = new ArrayAdapter<>(CreateFileActivity.this, - R.layout.spinner_item, branchesList); + R.layout.list_spinner_items, branchesList); - adapter.setDropDownViewResource(R.layout.spinner_dropdown_item); newFileBranchesSpinner.setAdapter(adapter); enableProcessButton(); + newFileBranchesSpinner.setOnItemClickListener ((parent, view, position, id) -> { + + selectedBranch = branchesList.get(position).getName(); + + if(selectedBranch.equals("No branch")) { + + newFileBranchName.setEnabled(true); + newFileBranchName.setVisibility(View.VISIBLE); + } + else { + + newFileBranchName.setEnabled(false); + newFileBranchName.setVisibility(View.GONE); + newFileBranchName.setText(""); + } + + }); + } } @@ -512,6 +491,7 @@ public class CreateFileActivity extends BaseActivity { @Override public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + Log.e("onFailure", t.toString()); } }); @@ -519,6 +499,7 @@ public class CreateFileActivity extends BaseActivity { } private void initCloseListener() { + onClickListener = view -> finish(); } diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateReleaseActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateReleaseActivity.java index 99cba7d3..e1bf58e3 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateReleaseActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateReleaseActivity.java @@ -5,13 +5,12 @@ 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.AutoCompleteTextView; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; -import android.widget.Spinner; import androidx.annotation.NonNull; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; @@ -36,7 +35,7 @@ public class CreateReleaseActivity extends BaseActivity { private View.OnClickListener onClickListener; public ImageView closeActivity; private EditText releaseTagName; - private Spinner releaseBranch; + private AutoCompleteTextView releaseBranch; private EditText releaseTitle; private EditText releaseContent; private CheckBox releaseType; @@ -44,6 +43,14 @@ public class CreateReleaseActivity extends BaseActivity { private Button createNewRelease; final Context ctx = this; private Context appCtx; + private TinyDB tinyDb; + private String selectedBranch; + + private String instanceUrl; + private String loginUid; + private String instanceToken; + private String repoOwner; + private String repoName; List branchesList = new ArrayList<>(); @@ -57,19 +64,19 @@ public class CreateReleaseActivity extends BaseActivity { super.onCreate(savedInstanceState); appCtx = getApplicationContext(); + tinyDb = new TinyDB(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - TinyDB tinyDb = new TinyDB(appCtx); - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + instanceUrl = tinyDb.getString("instanceUrl"); + loginUid = tinyDb.getString("loginUid"); + instanceToken = "token " + tinyDb.getString(loginUid + "-token"); String repoFullName = tinyDb.getString("repoFullName"); String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + repoOwner = parts[0]; + repoName = parts[1]; closeActivity = findViewById(R.id.close); releaseTagName = findViewById(R.id.releaseTagName); @@ -78,26 +85,15 @@ public class CreateReleaseActivity extends BaseActivity { releaseType = findViewById(R.id.releaseType); releaseDraft = findViewById(R.id.releaseDraft); - releaseTagName.requestFocus(); + releaseTitle.requestFocus(); assert imm != null; - imm.showSoftInput(releaseTagName, InputMethodManager.SHOW_IMPLICIT); + imm.showSoftInput(releaseTitle, InputMethodManager.SHOW_IMPLICIT); initCloseListener(); closeActivity.setOnClickListener(onClickListener); releaseBranch = findViewById(R.id.releaseBranch); getBranches(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName); - releaseBranch.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - Branches branch = (Branches) parent.getSelectedItem(); - } - - @Override - public void onNothingSelected(AdapterView parent) { - - } - }); createNewRelease = findViewById(R.id.createNewRelease); disableProcessButton(); @@ -119,19 +115,10 @@ public class CreateReleaseActivity extends BaseActivity { boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); - TinyDB tinyDb = new TinyDB(appCtx); - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - String newReleaseTagName = releaseTagName.getText().toString(); String newReleaseTitle = releaseTitle.getText().toString(); String newReleaseContent = releaseContent.getText().toString(); - String newReleaseBranch = releaseBranch.getSelectedItem().toString(); + String checkBranch = selectedBranch; boolean newReleaseType = releaseType.isChecked(); boolean newReleaseDraft = releaseDraft.isChecked(); @@ -142,28 +129,32 @@ public class CreateReleaseActivity extends BaseActivity { } + if(newReleaseTitle.equals("")) { + + Toasty.error(ctx, getString(R.string.titleErrorEmpty)); + return; + } + if(newReleaseTagName.equals("")) { Toasty.error(ctx, getString(R.string.tagNameErrorEmpty)); return; - } - if(newReleaseTitle.equals("")) { + if(checkBranch == null) { - Toasty.error(ctx, getString(R.string.titleErrorEmpty)); - return; - - } + Toasty.error(ctx, getString(R.string.selectBranchError)); + return; + } disableProcessButton(); - createNewReleaseFunc(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, newReleaseTagName, newReleaseTitle, newReleaseContent, newReleaseBranch, newReleaseType, newReleaseDraft); + createNewReleaseFunc(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, newReleaseTagName, newReleaseTitle, newReleaseContent, selectedBranch, newReleaseType, newReleaseDraft); } - private void createNewReleaseFunc(final String instanceUrl, final String token, String repoOwner, String repoName, String newReleaseTagName, String newReleaseTitle, String newReleaseContent, String newReleaseBranch, boolean newReleaseType, boolean newReleaseDraft) { + private void createNewReleaseFunc(final String instanceUrl, final String token, String repoOwner, String repoName, String newReleaseTagName, String newReleaseTitle, String newReleaseContent, String selectedBranch, boolean newReleaseType, boolean newReleaseDraft) { - Releases createReleaseJson = new Releases(newReleaseContent, newReleaseDraft, newReleaseTitle, newReleaseType, newReleaseTagName, newReleaseBranch); + Releases createReleaseJson = new Releases(newReleaseContent, newReleaseDraft, newReleaseTitle, newReleaseType, newReleaseTagName, selectedBranch); Call call; @@ -179,12 +170,10 @@ public class CreateReleaseActivity extends BaseActivity { if (response.code() == 201) { - TinyDB tinyDb = new TinyDB(appCtx); tinyDb.putBoolean("updateReleases", true); Toasty.success(ctx, getString(R.string.releaseCreatedText)); enableProcessButton(); finish(); - } else if(response.code() == 401) { @@ -218,6 +207,7 @@ public class CreateReleaseActivity extends BaseActivity { @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Log.e("onFailure", t.toString()); enableProcessButton(); } @@ -244,23 +234,20 @@ public class CreateReleaseActivity extends BaseActivity { assert branchesList_ != null; if(branchesList_.size() > 0) { - for (int i = 0; i < branchesList_.size(); i++) { - Branches data = new Branches( - branchesList_.get(i).getName() - ); - branchesList.add(data); - - } + branchesList.addAll(branchesList_); } - ArrayAdapter adapter = new ArrayAdapter<>(CreateReleaseActivity.this, - R.layout.spinner_item, branchesList); + ArrayAdapter adapter = new ArrayAdapter<>(CreateReleaseActivity.this, + R.layout.list_spinner_items, branchesList); - adapter.setDropDownViewResource(R.layout.spinner_dropdown_item); releaseBranch.setAdapter(adapter); enableProcessButton(); + releaseBranch.setOnItemClickListener ((parent, view, position, id) -> + + selectedBranch = branchesList.get(position).getName() + ); } } else if(response.code() == 401) { @@ -276,6 +263,7 @@ public class CreateReleaseActivity extends BaseActivity { @Override public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + Log.e("onFailure", t.toString()); } }); @@ -283,12 +271,8 @@ public class CreateReleaseActivity extends BaseActivity { } private void initCloseListener() { - onClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { - finish(); - } - }; + + onClickListener = view -> finish(); } private void disableProcessButton() { diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateRepoActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateRepoActivity.java index c231068d..6234c219 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateRepoActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateRepoActivity.java @@ -2,16 +2,17 @@ package org.mian.gitnex.activities; import android.content.Context; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.view.View; import android.view.inputmethod.InputMethodManager; -import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; -import android.widget.Spinner; import androidx.annotation.NonNull; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; @@ -37,15 +38,23 @@ public class CreateRepoActivity extends BaseActivity { public ImageView closeActivity; private View.OnClickListener onClickListener; - private Spinner spinner; + private AutoCompleteTextView spinner; private Button createRepo; private EditText repoName; private EditText repoDesc; private CheckBox repoAccess; final Context ctx = this; private Context appCtx; + private TinyDB tinyDb; - List organizationsList = new ArrayList<>(); + private String instanceUrl; + private String loginUid; + private String userLogin; + private String instanceToken; + + private String selectedOwner; + + List organizationsList = new ArrayList<>(); //https://github.com/go-gitea/gitea/blob/52cfd2743c0e85b36081cf80a850e6a5901f1865/models/repo.go#L964-L967 final List reservedRepoNames = Arrays.asList(".", ".."); @@ -61,14 +70,14 @@ public class CreateRepoActivity extends BaseActivity { super.onCreate(savedInstanceState); appCtx = getApplicationContext(); + tinyDb = new TinyDB(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(ctx); - TinyDB tinyDb = new TinyDB(appCtx); - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String userLogin = tinyDb.getString("userLogin"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + instanceUrl = tinyDb.getString("instanceUrl"); + loginUid = tinyDb.getString("loginUid"); + userLogin = tinyDb.getString("userLogin"); + instanceToken = "token " + tinyDb.getString(loginUid + "-token"); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); @@ -87,18 +96,6 @@ public class CreateRepoActivity extends BaseActivity { spinner = findViewById(R.id.ownerSpinner); getOrganizations(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), userLogin); - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - OrgOwner user = (OrgOwner) parent.getSelectedItem(); - } - - @Override - public void onNothingSelected(AdapterView parent) { - - } - }); - createRepo = findViewById(R.id.createNewRepoButton); disableProcessButton(); @@ -112,24 +109,15 @@ public class CreateRepoActivity extends BaseActivity { } } - private View.OnClickListener createRepoListener = new View.OnClickListener() { - public void onClick(View v) { - processNewRepo(); - } - }; + private View.OnClickListener createRepoListener = v -> processNewRepo(); private void processNewRepo() { boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); AppUtil appUtil = new AppUtil(); - TinyDB tinyDb = new TinyDB(appCtx); - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); String newRepoName = repoName.getText().toString(); String newRepoDesc = repoDesc.getText().toString(); - String repoOwner = spinner.getSelectedItem().toString(); boolean newRepoAccess = repoAccess.isChecked(); if(!connToInternet) { @@ -161,20 +149,24 @@ public class CreateRepoActivity extends BaseActivity { else if (reservedRepoPatterns.matcher(newRepoName).find()) { Toasty.warning(ctx, getString(R.string.repoNameErrorReservedPatterns)); + } + else if(selectedOwner == null) { + + Toasty.error(ctx, getString(R.string.repoOwnerError)); } else { disableProcessButton(); - createNewRepository(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), loginUid, newRepoName, newRepoDesc, repoOwner, newRepoAccess); + createNewRepository(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), loginUid, newRepoName, newRepoDesc, selectedOwner, newRepoAccess); } } - private void createNewRepository(final String instanceUrl, final String token, String loginUid, String repoName, String repoDesc, String repoOwner, boolean isPrivate) { + private void createNewRepository(final String instanceUrl, final String token, String loginUid, String repoName, String repoDesc, String selectedOwner, boolean isPrivate) { OrganizationRepository createRepository = new OrganizationRepository(true, repoDesc, null, null, repoName, isPrivate, "Default"); Call call; - if(repoOwner.equals(loginUid)) { + if(selectedOwner.equals(loginUid)) { call = RetrofitClient .getInstance(instanceUrl, ctx) @@ -186,7 +178,7 @@ public class CreateRepoActivity extends BaseActivity { call = RetrofitClient .getInstance(instanceUrl, ctx) .getApiInterface() - .createNewUserOrgRepository(token, repoOwner, createRepository); + .createNewUserOrgRepository(token, selectedOwner, createRepository); } call.enqueue(new Callback() { @@ -234,8 +226,6 @@ public class CreateRepoActivity extends BaseActivity { private void getOrganizations(String instanceUrl, String instanceToken, final String userLogin) { - TinyDB tinyDb = new TinyDB(appCtx); - Call> call = RetrofitClient .getInstance(instanceUrl, ctx) .getApiInterface() @@ -246,59 +236,58 @@ public class CreateRepoActivity extends BaseActivity { @Override public void onResponse(@NonNull Call> call, @NonNull retrofit2.Response> response) { - if(response.isSuccessful()) { - if(response.code() == 200) { + if(response.code() == 200) { - int organizationId = 0; + int organizationId = 0; - List organizationsList_ = response.body(); + List organizationsList_ = response.body(); - organizationsList.add(new OrgOwner(userLogin)); - assert organizationsList_ != null; - if(organizationsList_.size() > 0) { + organizationsList.add(new OrgOwner(userLogin)); + assert organizationsList_ != null; + if(organizationsList_.size() > 0) { - for (int i = 0; i < organizationsList_.size(); i++) { + for(int i = 0; i < organizationsList_.size(); i++) { - if(!tinyDb.getString("organizationId").isEmpty()) { + if(!tinyDb.getString("organizationId").isEmpty()) { - if (Integer.parseInt(tinyDb.getString("organizationId")) == organizationsList_.get(i).getId()) { - organizationId = i + 1; - } - } + if(Integer.parseInt(tinyDb.getString("organizationId")) == organizationsList_.get(i).getId()) { + organizationId = i + 1; + } + } - OrgOwner data = new OrgOwner( - organizationsList_.get(i).getUsername() - ); - organizationsList.add(data); + OrgOwner data = new OrgOwner(organizationsList_.get(i).getUsername()); + organizationsList.add(data); - } - } + } + } - ArrayAdapter adapter = new ArrayAdapter<>(CreateRepoActivity.this, - R.layout.spinner_item, organizationsList); + ArrayAdapter adapter = new ArrayAdapter<>(CreateRepoActivity.this, R.layout.list_spinner_items, organizationsList); - adapter.setDropDownViewResource(R.layout.spinner_dropdown_item); - spinner.setAdapter(adapter); + spinner.setAdapter(adapter); - if (tinyDb.getBoolean("organizationAction") & organizationId != 0) { + spinner.setOnItemClickListener ((parent, view, position, id) -> selectedOwner = organizationsList.get(position).getUsername()); - spinner.setSelection(organizationId); - tinyDb.putBoolean("organizationAction", false); - } + if(tinyDb.getBoolean("organizationAction") & organizationId != 0) { - enableProcessButton(); + int selectOwnerById = organizationId; + new Handler(Looper.getMainLooper()).postDelayed(() -> { - } - } - else if(response.code() == 401) { + spinner.setText(organizationsList.get(selectOwnerById).getUsername(), false); + selectedOwner = organizationsList.get(selectOwnerById).getUsername(); + }, 500); - enableProcessButton(); - AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), - getResources().getString(R.string.alertDialogTokenRevokedMessage), - getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), - getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); - } + tinyDb.putBoolean("organizationAction", false); + } + enableProcessButton(); + } + + else if(response.code() == 401) { + + enableProcessButton(); + AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), getResources().getString(R.string.alertDialogTokenRevokedMessage), + getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); + } } @Override diff --git a/app/src/main/java/org/mian/gitnex/activities/EditIssueActivity.java b/app/src/main/java/org/mian/gitnex/activities/EditIssueActivity.java index 9c0b84c6..d9f2c01b 100644 --- a/app/src/main/java/org/mian/gitnex/activities/EditIssueActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/EditIssueActivity.java @@ -4,21 +4,19 @@ import android.annotation.SuppressLint; import android.app.DatePickerDialog; import android.content.Context; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; import android.widget.Button; -import android.widget.DatePicker; 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.helpers.AlertDialogs; @@ -28,7 +26,6 @@ import org.mian.gitnex.helpers.StaticGlobalVariables; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Version; -import org.mian.gitnex.models.Collaborators; import org.mian.gitnex.models.CreateIssue; import org.mian.gitnex.models.Issues; import org.mian.gitnex.models.Milestones; @@ -39,7 +36,6 @@ import java.util.Calendar; import java.util.List; import retrofit2.Call; import retrofit2.Callback; -import retrofit2.Response; /** * Author M M Arif @@ -49,19 +45,27 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe final Context ctx = this; private Context appCtx; + private TinyDB tinyDb; private View.OnClickListener onClickListener; private int resultLimit = StaticGlobalVariables.resultLimitOldGiteaInstances; private EditText editIssueTitle; - private SocialAutoCompleteTextView editIssueDescription; + private EditText editIssueDescription; private TextView editIssueDueDate; private Button editIssueButton; - private Spinner editIssueMilestoneSpinner; + private AutoCompleteTextView editIssueMilestoneSpinner; private String msState = "open"; + private int milestoneId; List milestonesList = new ArrayList<>(); - private ArrayAdapter defaultMentionAdapter; + + private String instanceUrl; + private String loginUid; + private String instanceToken; + private String repoOwner; + private String repoName; + private int issueIndex; @Override protected int getLayoutResourceId(){ @@ -73,19 +77,18 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe super.onCreate(savedInstanceState); appCtx = getApplicationContext(); + tinyDb = new TinyDB(appCtx); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - final TinyDB tinyDb = new TinyDB(appCtx); - - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + instanceUrl = tinyDb.getString("instanceUrl"); + loginUid = tinyDb.getString("loginUid"); + instanceToken = "token " + tinyDb.getString(loginUid + "-token"); String repoFullName = tinyDb.getString("repoFullName"); String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final int issueIndex = Integer.parseInt(tinyDb.getString("issueNumber")); + repoOwner = parts[0]; + repoName = parts[1]; + issueIndex = Integer.parseInt(tinyDb.getString("issueNumber")); ImageView closeActivity = findViewById(R.id.close); editIssueButton = findViewById(R.id.editIssueButton); @@ -103,13 +106,8 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe assert imm != null; imm.showSoftInput(editIssueTitle, InputMethodManager.SHOW_IMPLICIT); - defaultMentionAdapter = new MentionArrayAdapter<>(this); - loadCollaboratorsList(); - editIssueMilestoneSpinner = findViewById(R.id.editIssueMilestoneSpinner); - editIssueDescription.setMentionAdapter(defaultMentionAdapter); - initCloseListener(); closeActivity.setOnClickListener(onClickListener); @@ -128,85 +126,16 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe disableProcessButton(); getIssue(instanceUrl, instanceToken, loginUid, repoOwner, repoName, issueIndex, resultLimit); - - - } - - public void loadCollaboratorsList() { - - final TinyDB tinyDb = new TinyDB(appCtx); - - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - Call> call = RetrofitClient - .getInstance(instanceUrl, ctx) - .getApiInterface() - .getCollaborators(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName); - - call.enqueue(new Callback>() { - - @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { - - if (response.isSuccessful()) { - - assert response.body() != null; - String fullName = ""; - for (int i = 0; i < response.body().size(); i++) { - if(!response.body().get(i).getFull_name().equals("")) { - fullName = response.body().get(i).getFull_name(); - } - defaultMentionAdapter.add( - new Mention(response.body().get(i).getUsername(), fullName, response.body().get(i).getAvatar_url())); - } - - } else { - - Log.i("onResponse", String.valueOf(response.code())); - - } - - } - - @Override - public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - Log.i("onFailure", t.toString()); - } - - }); } private void initCloseListener() { - onClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { - finish(); - } - }; + + onClickListener = view -> finish(); } private void processEditIssue() { boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); - TinyDB tinyDb = new TinyDB(appCtx); - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - final int issueIndex = Integer.parseInt(tinyDb.getString("issueNumber")); - - Milestones mModel = (Milestones) editIssueMilestoneSpinner.getSelectedItem(); - - int editIssueMilestoneId = mModel.getId(); String editIssueTitleForm = editIssueTitle.getText().toString(); String editIssueDescriptionForm = editIssueDescription.getText().toString(); @@ -226,30 +155,20 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe } - /*if (editIssueDescriptionForm.equals("")) { - - Toasty.info(ctx, getString(R.string.issueDescriptionEmpty)); - return; - - }*/ - if (editIssueDueDateForm.equals("")) { editIssueDueDateForm = null; } else { editIssueDueDateForm = (AppUtil.customDateCombine(AppUtil.customDateFormat(editIssueDueDateForm))); } - //Log.i("editIssueDueDateForm", String.valueOf(editIssueDueDateForm)); disableProcessButton(); - editIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid, editIssueTitleForm, editIssueDescriptionForm, editIssueDueDateForm, editIssueMilestoneId); + editIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid, editIssueTitleForm, editIssueDescriptionForm, editIssueDueDateForm, milestoneId); } - private void editIssue(String instanceUrl, String instanceToken, String repoOwner, String repoName, int issueIndex, String loginUid, String title, String description, String dueDate, int editIssueMilestoneId) { + private void editIssue(String instanceUrl, String instanceToken, String repoOwner, String repoName, int issueIndex, String loginUid, String title, String description, String dueDate, int milestoneId) { - final TinyDB tinyDb = new TinyDB(appCtx); - - CreateIssue issueData = new CreateIssue(title, description, dueDate, editIssueMilestoneId); + CreateIssue issueData = new CreateIssue(title, description, dueDate, milestoneId); Call call = RetrofitClient .getInstance(instanceUrl, ctx) @@ -264,9 +183,11 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe if(response.code() == 201) { if(tinyDb.getString("issueType").equalsIgnoreCase("Pull")) { + Toasty.success(ctx, getString(R.string.editPrSuccessMessage)); } else { + Toasty.success(ctx, getString(R.string.editIssueSuccessMessage)); } @@ -302,7 +223,6 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe } - @Override public void onClick(View v) { @@ -314,16 +234,7 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe final int mDay = c.get(Calendar.DAY_OF_MONTH); DatePickerDialog datePickerDialog = new DatePickerDialog(this, - new DatePickerDialog.OnDateSetListener() { - - @Override - public void onDateSet(DatePicker view, int year, - int monthOfYear, int dayOfMonth) { - - editIssueDueDate.setText(getString(R.string.setDueDate, year, (monthOfYear + 1), dayOfMonth)); - - } - }, mYear, mMonth, mDay); + (view, year, monthOfYear, dayOfMonth) -> editIssueDueDate.setText(getString(R.string.setDueDate, year, (monthOfYear + 1), dayOfMonth)), mYear, mMonth, mDay); datePickerDialog.show(); } @@ -351,9 +262,10 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe editIssueTitle.setText(response.body().getTitle()); editIssueDescription.setText(response.body().getBody()); - int msId = 0; + int currentMilestoneId = 0; if(response.body().getMilestone() != null) { - msId = response.body().getMilestone().getId(); + + currentMilestoneId = response.body().getMilestone().getId(); } // get milestones list @@ -364,14 +276,14 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe .getApiInterface() .getMilestones(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, 1, resultLimit, msState); - final int finalMsId = msId; + int checkMilestoneId = currentMilestoneId; - call_.enqueue(new Callback>() { + call_.enqueue(new Callback>() { @Override public void onResponse(@NonNull Call> call, @NonNull retrofit2.Response> response_) { - int finalMsId1 = 0; + int getSelectedMilestoneId = 0; if (response_.code() == 200) { @@ -379,31 +291,33 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe milestonesList.add(new Milestones(0, "No milestone")); assert milestonesList_ != null; + if (milestonesList_.size() > 0) { + + milestonesList.addAll(milestonesList_); + for (int i = 0; i < milestonesList_.size(); i++) { - Milestones data = new Milestones( - milestonesList_.get(i).getId(), - milestonesList_.get(i).getTitle() - ); - milestonesList.add(data); - - if(finalMsId == milestonesList_.get(i).getId()) { - finalMsId1 = i + 1; + if(checkMilestoneId == milestonesList_.get(i).getId()) { + getSelectedMilestoneId = i + 1; } - } } - ArrayAdapter adapter_ = new ArrayAdapter<>(EditIssueActivity.this, - R.layout.spinner_item, milestonesList); + ArrayAdapter adapter = new ArrayAdapter<>(EditIssueActivity.this, + R.layout.list_spinner_items, milestonesList); - adapter_.setDropDownViewResource(R.layout.spinner_dropdown_item); - editIssueMilestoneSpinner.setAdapter(adapter_); + editIssueMilestoneSpinner.setAdapter(adapter); + + editIssueMilestoneSpinner.setOnItemClickListener ((parent, view, position, id) -> milestoneId = milestonesList.get(position).getId()); + + int finalMsId = getSelectedMilestoneId; + new Handler(Looper.getMainLooper()).postDelayed(() -> { + + editIssueMilestoneSpinner.setText(milestonesList.get(finalMsId).getTitle(),false); + milestoneId = milestonesList.get(finalMsId).getId(); + }, 500); - if(milestonesList_.size() > 0) { - editIssueMilestoneSpinner.setSelection(finalMsId1); - } enableProcessButton(); } @@ -412,6 +326,7 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe @Override public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + Log.e("onFailure", t.toString()); } }); @@ -444,6 +359,7 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Log.e("onFailure", t.toString()); } }); diff --git a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java index 716cfa4d..f6c9e732 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -771,6 +771,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt } if(singleIssue.getMilestone() != null) { + viewBinding.issueMilestone.setVisibility(View.VISIBLE); viewBinding.issueMilestone.setText(getString(R.string.issueMilestone, singleIssue.getMilestone().getTitle())); } else { diff --git a/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java b/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java index e7016da7..927f634e 100644 --- a/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java @@ -5,12 +5,11 @@ import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; -import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.RadioGroup; -import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; @@ -53,10 +52,10 @@ public class LoginActivity extends BaseActivity { private Button loginButton; private EditText instanceUrlET, loginUidET, loginPassword, otpCode, loginTokenCode; - private Spinner protocolSpinner; - private TextView otpInfo; + private AutoCompleteTextView protocolSpinner; private RadioGroup loginMethod; private String device_id = "token"; + private String selectedProtocol; @Override protected int getLayoutResourceId() { @@ -78,45 +77,47 @@ public class LoginActivity extends BaseActivity { loginUidET = findViewById(R.id.login_uid); loginPassword = findViewById(R.id.login_passwd); otpCode = findViewById(R.id.otpCode); - otpInfo = findViewById(R.id.otpInfo); protocolSpinner = findViewById(R.id.httpsSpinner); loginMethod = findViewById(R.id.loginMethod); loginTokenCode = findViewById(R.id.loginTokenCode); ((TextView) findViewById(R.id.appVersion)).setText(AppUtil.getAppVersion(appCtx)); - ArrayAdapter adapterProtocols = new ArrayAdapter<>(LoginActivity.this, R.layout.spinner_item, Protocol.values()); - adapterProtocols.setDropDownViewResource(R.layout.spinner_dropdown_item); + ArrayAdapter adapterProtocols = new ArrayAdapter<>(LoginActivity.this, R.layout.list_spinner_items, Protocol.values()); protocolSpinner.setAdapter(adapterProtocols); - protocolSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - public void onItemSelected(AdapterView parent, View view, int pos, long id) { + protocolSpinner.setOnItemClickListener((parent, view, position, id) -> { - if(protocolSpinner.getSelectedItem() == Protocol.HTTP) { - Toasty.warning(ctx, getResources().getString(R.string.protocolError)); - } + selectedProtocol = String.valueOf(parent.getItemAtPosition(position)); + + if(selectedProtocol.equals(String.valueOf(Protocol.HTTP))) { + Toasty.warning(ctx, getResources().getString(R.string.protocolError)); } - - public void onNothingSelected(AdapterView parent) { - - } - }); + if(R.id.loginToken == loginMethod.getCheckedRadioButtonId()) { + + AppUtil.setMultiVisibility(View.GONE, findViewById(R.id.login_uidLayout), findViewById(R.id.login_passwdLayout), findViewById(R.id.otpCodeLayout)); + findViewById(R.id.loginTokenCodeLayout).setVisibility(View.VISIBLE); + } + else { + + AppUtil.setMultiVisibility(View.VISIBLE, findViewById(R.id.login_uidLayout), findViewById(R.id.login_passwdLayout), findViewById(R.id.otpCodeLayout)); + findViewById(R.id.loginTokenCodeLayout).setVisibility(View.GONE); + } + loginMethod.setOnCheckedChangeListener((group, checkedId) -> { if(checkedId == R.id.loginToken) { - AppUtil.setMultiVisibility(View.GONE, loginUidET, loginPassword, otpCode, otpInfo); - loginTokenCode.setVisibility(View.VISIBLE); - + AppUtil.setMultiVisibility(View.GONE, findViewById(R.id.login_uidLayout), findViewById(R.id.login_passwdLayout), findViewById(R.id.otpCodeLayout)); + findViewById(R.id.loginTokenCodeLayout).setVisibility(View.VISIBLE); } else { - AppUtil.setMultiVisibility(View.VISIBLE, loginUidET, loginPassword, otpCode, otpInfo); - loginTokenCode.setVisibility(View.GONE); - + AppUtil.setMultiVisibility(View.VISIBLE, findViewById(R.id.login_uidLayout), findViewById(R.id.login_passwdLayout), findViewById(R.id.otpCodeLayout)); + findViewById(R.id.loginTokenCodeLayout).setVisibility(View.GONE); } }); @@ -149,16 +150,22 @@ public class LoginActivity extends BaseActivity { try { + if(selectedProtocol == null) { + + Toasty.error(ctx, getResources().getString(R.string.protocolEmptyError)); + enableProcessButton(); + return; + } + String loginUid = loginUidET.getText().toString(); String loginPass = loginPassword.getText().toString(); String loginToken = loginTokenCode.getText().toString().trim(); - Protocol protocol = (Protocol) protocolSpinner.getSelectedItem(); LoginType loginType = (loginMethod.getCheckedRadioButtonId() == R.id.loginUsernamePassword) ? LoginType.BASIC : LoginType.TOKEN; URI rawInstanceUrl = UrlBuilder.fromString(UrlHelper.fixScheme(instanceUrlET.getText().toString(), "http")).toUri(); - URI instanceUrl = UrlBuilder.fromUri(rawInstanceUrl).withScheme(protocol.name().toLowerCase()).withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/")) + URI instanceUrl = UrlBuilder.fromUri(rawInstanceUrl).withScheme(selectedProtocol.toLowerCase()).withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/")) .toUri(); tinyDB.putString("loginType", loginType.name().toLowerCase()); @@ -170,7 +177,6 @@ public class LoginActivity extends BaseActivity { Toasty.error(ctx, getResources().getString(R.string.emptyFieldURL)); enableProcessButton(); return; - } if(loginType == LoginType.BASIC) { @@ -180,14 +186,12 @@ public class LoginActivity extends BaseActivity { Toasty.warning(ctx, getResources().getString(R.string.loginOTPTypeError)); enableProcessButton(); return; - } if(rawInstanceUrl.getUserInfo() != null) { tinyDB.putString("basicAuthPassword", loginPass); tinyDB.putBoolean("basicAuthFlag", true); - } if(loginUid.equals("")) { @@ -195,7 +199,6 @@ public class LoginActivity extends BaseActivity { Toasty.error(ctx, getResources().getString(R.string.emptyFieldUsername)); enableProcessButton(); return; - } if(loginPass.equals("")) { @@ -203,7 +206,6 @@ public class LoginActivity extends BaseActivity { Toasty.error(ctx, getResources().getString(R.string.emptyFieldPassword)); enableProcessButton(); return; - } int loginOTP = (otpCode.length() > 0) ? Integer.parseInt(otpCode.getText().toString().trim()) : 0; 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 5b6d2f6f..54387d03 100644 --- a/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java @@ -6,12 +6,9 @@ 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 androidx.annotation.NonNull; import com.google.gson.JsonElement; -import com.hendraanggrian.appcompat.socialview.Mention; -import com.hendraanggrian.appcompat.widget.MentionArrayAdapter; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityMergePullRequestBinding; @@ -21,15 +18,13 @@ import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Version; -import org.mian.gitnex.models.Collaborators; import org.mian.gitnex.models.MergePullRequest; import org.mian.gitnex.models.MergePullRequestSpinner; import java.util.ArrayList; -import java.util.List; +import java.util.Objects; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.Callback; -import retrofit2.Response; /** * Author M M Arif @@ -40,9 +35,17 @@ public class MergePullRequestActivity extends BaseActivity { private View.OnClickListener onClickListener; final Context ctx = this; private Context appCtx; + private TinyDB tinyDb; + + private String instanceUrl; + private String loginUid; + private String instanceToken; + private String repoOwner; + private String repoName; + private int prIndex; + private ActivityMergePullRequestBinding viewBinding; - private ArrayAdapter defaultMentionAdapter; private String Do; @Override @@ -57,13 +60,22 @@ public class MergePullRequestActivity extends BaseActivity { super.onCreate(savedInstanceState); appCtx = getApplicationContext(); + tinyDb = new TinyDB(appCtx); viewBinding = ActivityMergePullRequestBinding.inflate(getLayoutInflater()); View view = viewBinding.getRoot(); setContentView(view); + instanceUrl = tinyDb.getString("instanceUrl"); + loginUid = tinyDb.getString("loginUid"); + instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + String repoFullName = tinyDb.getString("repoFullName"); + String[] parts = repoFullName.split("/"); + repoOwner = parts[0]; + repoName = parts[1]; + prIndex = Integer.parseInt(tinyDb.getString("issueNumber")); + boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); - TinyDB tinyDb = new TinyDB(appCtx); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); @@ -73,29 +85,8 @@ public class MergePullRequestActivity extends BaseActivity { setMergeAdapter(); - viewBinding.mergeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - - MergePullRequestSpinner mergeId = (MergePullRequestSpinner) parent.getSelectedItem(); - Do = mergeId.getId(); - - } - - @Override - public void onNothingSelected(AdapterView parent) { - - } - - }); - - defaultMentionAdapter = new MentionArrayAdapter<>(this); - loadCollaboratorsList(); - - viewBinding.mergeDescription.setMentionAdapter(defaultMentionAdapter); - if(!tinyDb.getString("issueTitle").isEmpty()) { + viewBinding.toolbarTitle.setText(tinyDb.getString("issueTitle")); viewBinding.mergeTitle.setText(tinyDb.getString("issueTitle") + " (#" + tinyDb.getString("issueNumber") + ")"); } @@ -136,8 +127,6 @@ public class MergePullRequestActivity extends BaseActivity { private void setMergeAdapter() { - TinyDB tinyDb = new TinyDB(appCtx); - ArrayList mergeList = new ArrayList<>(); mergeList.add(new MergePullRequestSpinner("merge", getResources().getString(R.string.mergeOptionMerge))); @@ -148,58 +137,14 @@ public class MergePullRequestActivity extends BaseActivity { 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); + ArrayAdapter adapter = new ArrayAdapter<>(MergePullRequestActivity.this, R.layout.list_spinner_items, mergeList); viewBinding.mergeSpinner.setAdapter(adapter); - } - - public void loadCollaboratorsList() { - - final TinyDB tinyDb = new TinyDB(appCtx); - - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - Call> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getCollaborators(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName); - - call.enqueue(new Callback>() { - - @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { - - if(response.isSuccessful()) { - - assert response.body() != null; - String fullName = ""; - for(int i = 0; i < response.body().size(); i++) { - if(!response.body().get(i).getFull_name().equals("")) { - fullName = response.body().get(i).getFull_name(); - } - defaultMentionAdapter.add(new Mention(response.body().get(i).getUsername(), fullName, response.body().get(i).getAvatar_url())); - } - - } - else { - - Log.i("onResponse", String.valueOf(response.code())); - - } - - } - - @Override - public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - - Log.i("onFailure", t.toString()); - } + viewBinding.mergeSpinner.setOnItemClickListener ((parent, view, position, id) -> { + Do = mergeList.get(position).getId(); }); + } private void initCloseListener() { @@ -211,8 +156,8 @@ public class MergePullRequestActivity extends BaseActivity { private void processMergePullRequest() { - String mergePRDesc = viewBinding.mergeDescription.getText().toString(); - String mergePRTitle = viewBinding.mergeTitle.getText().toString(); + String mergePRDesc = Objects.requireNonNull(viewBinding.mergeDescription.getText()).toString(); + String mergePRTitle = Objects.requireNonNull(viewBinding.mergeTitle.getText()).toString(); boolean deleteBranch = viewBinding.deleteBranch.isChecked(); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); @@ -221,27 +166,21 @@ public class MergePullRequestActivity extends BaseActivity { Toasty.error(ctx, getResources().getString(R.string.checkNetConnection)); return; - } - disableProcessButton(); - mergeFunction(Do, mergePRDesc, mergePRTitle, deleteBranch); + if(Do == null) { + Toasty.error(ctx, getResources().getString(R.string.selectMergeStrategy)); + } + else { + + disableProcessButton(); + mergeFunction(Do, mergePRDesc, mergePRTitle, deleteBranch); + } } private void mergeFunction(String Do, String mergePRDT, String mergeTitle, boolean deleteBranch) { - final TinyDB tinyDb = new TinyDB(appCtx); - - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final int prIndex = Integer.parseInt(tinyDb.getString("issueNumber")); - MergePullRequest mergePR = new MergePullRequest(Do, mergePRDT, mergeTitle); Call call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().mergePullRequest(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, prIndex, mergePR); @@ -268,7 +207,6 @@ public class MergePullRequestActivity extends BaseActivity { tinyDb.putBoolean("prMerged", true); tinyDb.putBoolean("resumePullRequests", true); finish(); - } else { @@ -283,7 +221,6 @@ public class MergePullRequestActivity extends BaseActivity { tinyDb.putBoolean("prMerged", true); tinyDb.putBoolean("resumePullRequests", true); finish(); - } } @@ -293,7 +230,6 @@ public class MergePullRequestActivity extends BaseActivity { tinyDb.putBoolean("prMerged", true); tinyDb.putBoolean("resumePullRequests", true); finish(); - } } @@ -301,19 +237,16 @@ public class MergePullRequestActivity extends BaseActivity { enableProcessButton(); AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); - } else if(response.code() == 404) { enableProcessButton(); Toasty.warning(ctx, getString(R.string.mergePR404ErrorMsg)); - } else { enableProcessButton(); Toasty.error(ctx, getString(R.string.genericError)); - } } @@ -331,11 +264,6 @@ 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 @@ -351,7 +279,6 @@ public class MergePullRequestActivity extends BaseActivity { if(response.code() == 204) { Log.i("deleteBranch", "Branch deleted successfully"); - } } @@ -361,7 +288,6 @@ public class MergePullRequestActivity extends BaseActivity { Log.e("onFailure", t.toString()); enableProcessButton(); - } }); diff --git a/app/src/main/java/org/mian/gitnex/activities/ReplyToIssueActivity.java b/app/src/main/java/org/mian/gitnex/activities/ReplyToIssueActivity.java index a7b6fd79..7835752f 100644 --- a/app/src/main/java/org/mian/gitnex/activities/ReplyToIssueActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/ReplyToIssueActivity.java @@ -11,15 +11,12 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; -import android.widget.ArrayAdapter; import android.widget.Button; +import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; -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.actions.IssueActions; import org.mian.gitnex.clients.RetrofitClient; @@ -30,13 +27,10 @@ import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.StaticGlobalVariables; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.models.Collaborators; import org.mian.gitnex.models.Issues; -import java.util.List; import java.util.Objects; import retrofit2.Call; import retrofit2.Callback; -import retrofit2.Response; /** * Author M M Arif @@ -51,8 +45,7 @@ public class ReplyToIssueActivity extends BaseActivity { private Context appCtx; private TextView draftSaved; - private SocialAutoCompleteTextView addComment; - private ArrayAdapter defaultMentionAdapter; + private EditText addComment; private Button replyButton; private String TAG = StaticGlobalVariables.replyToIssueActivity; private long draftIdOnCreate; @@ -79,11 +72,6 @@ public class ReplyToIssueActivity extends BaseActivity { addComment = findViewById(R.id.addComment); addComment.setShowSoftInputOnFocus(true); - defaultMentionAdapter = new MentionArrayAdapter<>(ctx); - loadCollaboratorsList(); - - addComment.setMentionAdapter(defaultMentionAdapter); - closeActivity = findViewById(R.id.close); TextView toolbar_title = findViewById(R.id.toolbar_title); @@ -121,13 +109,11 @@ public class ReplyToIssueActivity extends BaseActivity { if(getIntent().getBooleanExtra("cursorToEnd", false)) { addComment.setSelection(addComment.length()); } - } if(getIntent().getStringExtra("draftTitle") != null) { toolbar_title.setText(getIntent().getStringExtra("draftTitle")); - } if(getIntent().getStringExtra("commentAction") != null && Objects.equals(getIntent().getStringExtra("commentAction"), "edit") && !Objects.equals(getIntent().getStringExtra("commentId"), "new")) { @@ -144,14 +130,12 @@ public class ReplyToIssueActivity extends BaseActivity { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } public void onTextChanged(CharSequence s, int start, int before, int count) { saveDraft(addComment.getText().toString(), commentId, draftIdOnCreate); draftSaved.setVisibility(View.VISIBLE); - } }); @@ -161,7 +145,6 @@ public class ReplyToIssueActivity extends BaseActivity { disableProcessButton(); assert commentId != null; IssueActions.editIssueComment(ctx, Integer.parseInt(commentId), addComment.getText().toString(), draftIdOnCreate); - }); return; @@ -171,18 +154,15 @@ public class ReplyToIssueActivity extends BaseActivity { addComment.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { - } public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } public void onTextChanged(CharSequence s, int start, int before, int count) { saveDraft(addComment.getText().toString(), "new", draftIdOnCreate); draftSaved.setVisibility(View.VISIBLE); - } }); @@ -190,12 +170,10 @@ public class ReplyToIssueActivity extends BaseActivity { if(!connToInternet) { disableProcessButton(); - } else { replyButton.setOnClickListener(replyToIssue); - } } @@ -234,57 +212,6 @@ public class ReplyToIssueActivity extends BaseActivity { } - public void loadCollaboratorsList() { - - final TinyDB tinyDb = new TinyDB(appCtx); - - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - Call> call = RetrofitClient - .getInstance(instanceUrl, ctx) - .getApiInterface() - .getCollaborators(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName); - - call.enqueue(new Callback>() { - - @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { - - if (response.isSuccessful()) { - - assert response.body() != null; - String fullName = ""; - for(int i = 0; i < response.body().size(); i++) { - if(!response.body().get(i).getFull_name().equals("")) { - fullName = response.body().get(i).getFull_name(); - } - defaultMentionAdapter.add(new Mention(response.body().get(i).getUsername(), fullName, response.body().get(i).getAvatar_url())); - } - - } - else { - - Log.i(TAG, String.valueOf(response.code())); - - } - - } - - @Override - public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - - Log.e(TAG, t.toString()); - } - - }); - } - private void initCloseListener() { onClickListener = view -> finish(); @@ -301,19 +228,16 @@ public class ReplyToIssueActivity extends BaseActivity { Toasty.error(ctx, getResources().getString(R.string.checkNetConnection)); return; - } if(newReplyDT.equals("")) { Toasty.error(ctx, getString(R.string.commentEmptyError)); - } else { disableProcessButton(); replyComment(newReplyDT); - } } diff --git a/app/src/main/res/layout/activity_add_collaborator_to_repository.xml b/app/src/main/res/layout/activity_add_collaborator_to_repository.xml index d03c9837..030ae915 100644 --- a/app/src/main/res/layout/activity_add_collaborator_to_repository.xml +++ b/app/src/main/res/layout/activity_add_collaborator_to_repository.xml @@ -1,7 +1,7 @@ - @@ -42,24 +42,52 @@ - + style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate" + android:visibility="gone" + app:indicatorColor="?attr/progressIndicatorColor" /> + + + + + + + + + + - - diff --git a/app/src/main/res/layout/activity_add_new_team_member.xml b/app/src/main/res/layout/activity_add_new_team_member.xml index e1c438f8..298a878d 100644 --- a/app/src/main/res/layout/activity_add_new_team_member.xml +++ b/app/src/main/res/layout/activity_add_new_team_member.xml @@ -50,24 +50,43 @@ style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate" app:indicatorColor="?attr/progressIndicatorColor" /> - + android:layout_marginStart="10dp" + android:layout_marginEnd="10dp" + android:layout_marginTop="10dp" + android:layout_marginBottom="10dp"> + + + + + + + + @@ -104,6 +102,7 @@ android:textColor="?attr/inputTextColor" android:textColorHighlight="?attr/hintColor" android:textColorHint="?attr/hintColor" + android:gravity="top|start" android:textSize="16sp" /> @@ -207,11 +206,9 @@