From b3a0f97ff4599e25f9b2e30aa2cd3b23ee47ead2 Mon Sep 17 00:00:00 2001 From: M M Arif Date: Wed, 27 Mar 2024 20:14:20 +0500 Subject: [PATCH] Add ssh key to user account --- .../gitnex/fragments/SSHKeysFragment.java | 100 ++++++++++++++++++ .../custom_account_settings_add_ssh_key.xml | 97 +++++++++++++++++ .../fragment_account_settings_ssh_keys.xml | 13 +++ app/src/main/res/values/strings.xml | 7 ++ 4 files changed, 217 insertions(+) create mode 100644 app/src/main/res/layout/custom_account_settings_add_ssh_key.xml diff --git a/app/src/main/java/org/mian/gitnex/fragments/SSHKeysFragment.java b/app/src/main/java/org/mian/gitnex/fragments/SSHKeysFragment.java index c061dc07..fbab2c7c 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/SSHKeysFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/SSHKeysFragment.java @@ -9,12 +9,23 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import java.util.Objects; +import org.gitnex.tea4j.v2.models.CreateKeyOption; +import org.gitnex.tea4j.v2.models.PublicKey; +import org.mian.gitnex.R; import org.mian.gitnex.adapters.SSHKeysAdapter; +import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.databinding.CustomAccountSettingsAddSshKeyBinding; import org.mian.gitnex.databinding.FragmentAccountSettingsSshKeysBinding; +import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.viewmodels.AccountSettingsSSHKeysViewModel; +import retrofit2.Call; +import retrofit2.Callback; /** * @author M M Arif @@ -25,6 +36,9 @@ public class SSHKeysFragment extends Fragment { private Context context; private SSHKeysAdapter adapter; private AccountSettingsSSHKeysViewModel accountSettingsSSHKeysViewModel; + private CustomAccountSettingsAddSshKeyBinding newSSHKeyBinding; + private MaterialAlertDialogBuilder materialAlertDialogBuilder; + private AlertDialog dialogSaveKey; @Override public View onCreateView( @@ -33,6 +47,11 @@ public class SSHKeysFragment extends Fragment { viewBinding = FragmentAccountSettingsSshKeysBinding.inflate(inflater, container, false); context = getContext(); + assert context != null; + materialAlertDialogBuilder = + new MaterialAlertDialogBuilder( + context, R.style.ThemeOverlay_Material3_Dialog_Alert); + accountSettingsSSHKeysViewModel = new ViewModelProvider(this).get(AccountSettingsSSHKeysViewModel.class); @@ -51,9 +70,90 @@ public class SSHKeysFragment extends Fragment { fetchDataAsync(); + viewBinding.addNewSSHKey.setOnClickListener(editProperties -> showNewSSHKeyDialog()); + return viewBinding.getRoot(); } + private void showNewSSHKeyDialog() { + + newSSHKeyBinding = + CustomAccountSettingsAddSshKeyBinding.inflate(LayoutInflater.from(context)); + + View view = newSSHKeyBinding.getRoot(); + materialAlertDialogBuilder.setView(view); + + newSSHKeyBinding.keyStatus.setOnCheckedChangeListener( + (buttonView, isChecked) -> { + if (isChecked) { + newSSHKeyBinding.keyStatus.setText( + getString(R.string.sshKeyStatusReadWrite)); + } else { + newSSHKeyBinding.keyStatus.setText( + getString(R.string.sshKeyStatusReadOnly)); + } + }); + + newSSHKeyBinding.save.setOnClickListener( + saveKey -> { + if (Objects.requireNonNull(newSSHKeyBinding.keyTitle.getText()) + .toString() + .isEmpty() + || Objects.requireNonNull(newSSHKeyBinding.key.getText()) + .toString() + .isEmpty()) { + Toasty.error(context, getString(R.string.emptyFields)); + } else { + saveSSHKey( + String.valueOf(newSSHKeyBinding.keyTitle.getText()), + String.valueOf(newSSHKeyBinding.key.getText()), + newSSHKeyBinding.keyStatus.isChecked()); + } + }); + + dialogSaveKey = materialAlertDialogBuilder.show(); + } + + private void saveSSHKey(String title, String key, boolean keyStatus) { + + CreateKeyOption createKeyOption = new CreateKeyOption(); + createKeyOption.setTitle(title); + createKeyOption.setKey(key); + createKeyOption.setReadOnly(keyStatus); + + Call saveNewKey = + RetrofitClient.getApiInterface(context).userCurrentPostKey(createKeyOption); + + saveNewKey.enqueue( + new Callback<>() { + + @Override + public void onResponse( + @NonNull Call call, + @NonNull retrofit2.Response response) { + + if (response.code() == 202 || response.code() == 201) { + + dialogSaveKey.dismiss(); + accountSettingsSSHKeysViewModel.loadKeysList(context); + Toasty.success(context, getString(R.string.sshKeySuccess)); + } else if (response.code() == 422) { + + Toasty.error(context, getString(R.string.sshKeyError)); + } else { + + Toasty.error(context, getString(R.string.genericError)); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + Toasty.error(context, getString(R.string.genericServerResponseError)); + } + }); + } + @SuppressLint("NotifyDataSetChanged") private void fetchDataAsync() { diff --git a/app/src/main/res/layout/custom_account_settings_add_ssh_key.xml b/app/src/main/res/layout/custom_account_settings_add_ssh_key.xml new file mode 100644 index 00000000..70f3f9b2 --- /dev/null +++ b/app/src/main/res/layout/custom_account_settings_add_ssh_key.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_account_settings_ssh_keys.xml b/app/src/main/res/layout/fragment_account_settings_ssh_keys.xml index 7c6ac3a6..73536f9b 100644 --- a/app/src/main/res/layout/fragment_account_settings_ssh_keys.xml +++ b/app/src/main/res/layout/fragment_account_settings_ssh_keys.xml @@ -44,4 +44,17 @@ android:textSize="@dimen/dimen20sp" android:visibility="gone" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9314b78..afe2c66a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -373,6 +373,12 @@ SSH Keys This action will permanently delete email %s from your account. Email deleted successfully + Add SSH Key + Read-only Access + Read-write Access + SSH Key + New SSH key added successfully + Invalid SSH key or SSH key already exists @@ -541,6 +547,7 @@ None main License + Title Explore users