From b2c51f50ddd0ad698997f329c56cdd0022f04076 Mon Sep 17 00:00:00 2001 From: M M Arif Date: Mon, 25 Mar 2024 22:31:59 +0500 Subject: [PATCH] Delete email from account and other UI fixes --- app/build.gradle | 8 +- .../activities/IssueDetailActivity.java | 11 +- .../RepositorySettingsActivity.java | 5 +- .../AccountSettingsEmailsAdapter.java | 105 ++++++++++++++++-- .../gitnex/adapters/MilestonesAdapter.java | 2 +- .../org/mian/gitnex/adapters/TagsAdapter.java | 4 +- .../fragments/PullRequestCommitsFragment.java | 8 +- .../gitnex/viewmodels/ReleasesViewModel.java | 8 +- .../custom_repository_transfer_dialog.xml | 2 +- .../layout/list_account_settings_emails.xml | 52 +++++++-- app/src/main/res/values/strings.xml | 2 + 11 files changed, 171 insertions(+), 36 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index df246fdf..1b026151 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,8 +58,8 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.11.0' - implementation 'androidx.compose.material3:material3:1.2.0' - implementation 'androidx.compose.material3:material3-window-size-class:1.2.0' + implementation 'androidx.compose.material3:material3:1.2.1' + implementation 'androidx.compose.material3:material3-window-size-class:1.2.1' implementation 'androidx.viewpager2:viewpager2:1.1.0-beta02' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "androidx.legacy:legacy-support-v4:1.0.0" @@ -108,9 +108,9 @@ dependencies { coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5" implementation 'androidx.biometric:biometric:1.1.0' implementation 'com.github.chrisvest:stormpot:2.4.2' - implementation 'androidx.browser:browser:1.7.0' + implementation 'androidx.browser:browser:1.8.0' implementation 'com.google.android.flexbox:flexbox:3.0.0' - implementation('org.codeberg.gitnex:tea4j-autodeploy:4646f53557') { + implementation('org.codeberg.gitnex:tea4j-autodeploy:3f8f9fce13') { exclude module: 'org.apache.oltu.oauth2.common' } implementation 'io.github.amrdeveloper:codeview:1.3.9' 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 7a20cd22..a5edb4ff 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -274,6 +274,7 @@ public class IssueDetailActivity extends BaseActivity repoOwner = issue.getRepository().getOwner(); repoName = issue.getRepository().getName(); issueIndex = issue.getIssueIndex(); + Boolean isLocked = issue.getIssue().isIsLocked(); setSupportActionBar(viewBinding.toolbar); Objects.requireNonNull(getSupportActionBar()).setTitle(repoName); @@ -293,6 +294,12 @@ public class IssueDetailActivity extends BaseActivity viewBinding.recyclerView.setNestedScrollingEnabled(false); viewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(ctx)); + if (isLocked && !issue.getRepository().getPermissions().isAdmin()) { + viewBinding.addNewComment.setVisibility(View.GONE); + } else { + viewBinding.addNewComment.setVisibility(View.VISIBLE); + } + viewBinding.addNewComment.setOnClickListener( v -> { BottomSheetReplyFragment bottomSheetReplyFragment = @@ -1106,7 +1113,7 @@ public class IssueDetailActivity extends BaseActivity LinearLayout.LayoutParams.WRAP_CONTENT); paramsLabels.setMargins(0, 0, 15, 0); - if (issue.getIssue().getLabels().size() > 0) { + if (!issue.getIssue().getLabels().isEmpty()) { viewBinding.labelsScrollView.setVisibility(View.VISIBLE); @@ -1298,7 +1305,7 @@ public class IssueDetailActivity extends BaseActivity if (response.code() == 200) { assert attachment != null; - if (attachment.size() > 0) { + if (!attachment.isEmpty()) { viewBinding.attachmentFrame.setVisibility(View.VISIBLE); LinearLayout.LayoutParams paramsAttachment = 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 e258739a..f02d726d 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java @@ -31,7 +31,6 @@ import retrofit2.Callback; */ public class RepositorySettingsActivity extends BaseActivity { - private ActivityRepositorySettingsBinding viewBinding; private CustomRepositoryEditPropertiesDialogBinding propBinding; private CustomRepositoryDeleteDialogBinding deleteRepoBinding; private CustomRepositoryTransferDialogBinding transferRepoBinding; @@ -49,11 +48,11 @@ public class RepositorySettingsActivity extends BaseActivity { super.onCreate(savedInstanceState); - viewBinding = ActivityRepositorySettingsBinding.inflate(getLayoutInflater()); + org.mian.gitnex.databinding.ActivityRepositorySettingsBinding viewBinding = + ActivityRepositorySettingsBinding.inflate(getLayoutInflater()); setContentView(viewBinding.getRoot()); repository = RepositoryContext.fromIntent(getIntent()); - ; ImageView closeActivity = findViewById(R.id.close); diff --git a/app/src/main/java/org/mian/gitnex/adapters/AccountSettingsEmailsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/AccountSettingsEmailsAdapter.java index 20de1b8f..bd97d7a2 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/AccountSettingsEmailsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/AccountSettingsEmailsAdapter.java @@ -5,14 +5,22 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.core.content.res.ResourcesCompat; import androidx.recyclerview.widget.RecyclerView; import com.amulyakhare.textdrawable.TextDrawable; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.List; +import org.gitnex.tea4j.v2.models.DeleteEmailOption; import org.gitnex.tea4j.v2.models.Email; import org.mian.gitnex.R; +import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.helpers.Toasty; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; /** * @author M M Arif @@ -29,23 +37,28 @@ public class AccountSettingsEmailsAdapter } @NonNull @Override - public AccountSettingsEmailsAdapter.EmailsViewHolder onCreateViewHolder( - @NonNull ViewGroup parent, int viewType) { + public EmailsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_account_settings_emails, parent, false); - return new AccountSettingsEmailsAdapter.EmailsViewHolder(v); + return new EmailsViewHolder(v); } @Override - public void onBindViewHolder( - @NonNull AccountSettingsEmailsAdapter.EmailsViewHolder holder, int position) { + public void onBindViewHolder(@NonNull EmailsViewHolder holder, int position) { Email currentItem = emailsList.get(position); holder.userEmail.setText(currentItem.getEmail()); + LinearLayout.LayoutParams param = + new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + .1f); + if (currentItem.isPrimary()) { + holder.primaryFrame.setVisibility(View.VISIBLE); TextDrawable drawable = TextDrawable.builder() .beginConfig() @@ -64,9 +77,15 @@ public class AccountSettingsEmailsAdapter null), 8); holder.emailPrimary.setImageDrawable(drawable); + holder.deleteFrame.setVisibility(View.GONE); + holder.primaryFrame.setLayoutParams(param); } else { - holder.emailPrimary.setVisibility(View.GONE); + holder.primaryFrame.setVisibility(View.GONE); + holder.deleteFrame.setVisibility(View.VISIBLE); } + + holder.deleteFrame.setOnClickListener( + delEmail -> deleteEmailAddress(currentItem.getEmail(), position)); } @Override @@ -74,16 +93,88 @@ public class AccountSettingsEmailsAdapter return emailsList.size(); } - static class EmailsViewHolder extends RecyclerView.ViewHolder { + public static class EmailsViewHolder extends RecyclerView.ViewHolder { private final ImageView emailPrimary; private final TextView userEmail; + private final LinearLayout deleteFrame; + private final LinearLayout primaryFrame; private EmailsViewHolder(View itemView) { super(itemView); emailPrimary = itemView.findViewById(R.id.emailPrimary); userEmail = itemView.findViewById(R.id.userEmail); + deleteFrame = itemView.findViewById(R.id.deleteFrame); + primaryFrame = itemView.findViewById(R.id.primaryFrame); } } + + private void updateAdapter(int position) { + emailsList.remove(position); + notifyItemRemoved(position); + notifyItemRangeChanged(position, emailsList.size()); + } + + private void deleteEmailAddress(final String emailAddress, int position) { + + MaterialAlertDialogBuilder materialAlertDialogBuilder = + new MaterialAlertDialogBuilder( + context, R.style.ThemeOverlay_Material3_Dialog_Alert); + + DeleteEmailOption deleteEmailOption = new DeleteEmailOption(); + deleteEmailOption.addEmailsItem(emailAddress); + + materialAlertDialogBuilder + .setMessage( + String.format( + context.getString(R.string.deleteEmailPopupText), emailAddress)) + .setPositiveButton( + R.string.menuDeleteText, + (dialog, whichButton) -> + RetrofitClient.getApiInterface(context) + .userDeleteEmailWithBody(deleteEmailOption) + .enqueue( + new Callback<>() { + + @Override + public void onResponse( + @NonNull Call call, + @NonNull Response response) { + + if (response.isSuccessful()) { + updateAdapter(position); + Toasty.success( + context, + context.getString( + R.string + .deleteEmailSuccess)); + } else if (response.code() == 403) { + Toasty.error( + context, + context.getString( + R.string + .authorizeError)); + } else { + Toasty.error( + context, + context.getString( + R.string.genericError)); + } + } + + @Override + public void onFailure( + @NonNull Call call, + @NonNull Throwable t) { + + Toasty.error( + context, + context.getString( + R.string.genericError)); + } + })) + .setNeutralButton(R.string.cancelButton, null) + .show(); + } } diff --git a/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java index 1cf19c05..be379fe2 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java @@ -191,7 +191,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter() { @@ -184,7 +186,9 @@ public class PullRequestCommitsFragment extends Fragment { issue.getRepository().getName(), (long) issue.getIssueIndex(), page, - resultLimit); + resultLimit, + null, + null); call.enqueue( new Callback<>() { diff --git a/app/src/main/java/org/mian/gitnex/viewmodels/ReleasesViewModel.java b/app/src/main/java/org/mian/gitnex/viewmodels/ReleasesViewModel.java index 20f336f4..6865c60f 100644 --- a/app/src/main/java/org/mian/gitnex/viewmodels/ReleasesViewModel.java +++ b/app/src/main/java/org/mian/gitnex/viewmodels/ReleasesViewModel.java @@ -39,7 +39,7 @@ public class ReleasesViewModel extends ViewModel { Call> call = RetrofitClient.getApiInterface(ctx) - .repoListReleases(owner, repo, null, null, null, 1, resultLimit); + .repoListReleases(owner, repo, null, null, 1, resultLimit); call.enqueue( new Callback<>() { @@ -69,7 +69,7 @@ public class ReleasesViewModel extends ViewModel { Call> call = RetrofitClient.getApiInterface(ctx) - .repoListReleases(owner, repo, null, null, null, page, resultLimit); + .repoListReleases(owner, repo, null, null, page, resultLimit); call.enqueue( new Callback<>() { @@ -84,7 +84,7 @@ public class ReleasesViewModel extends ViewModel { assert list != null; assert response.body() != null; - if (response.body().size() != 0) { + if (!response.body().isEmpty()) { list.addAll(response.body()); adapter.updateList(list); } else { @@ -157,7 +157,7 @@ public class ReleasesViewModel extends ViewModel { assert list != null; assert response.body() != null; - if (response.body().size() != 0) { + if (!response.body().isEmpty()) { list.addAll(response.body()); adapter.updateList(list); } else { diff --git a/app/src/main/res/layout/custom_repository_transfer_dialog.xml b/app/src/main/res/layout/custom_repository_transfer_dialog.xml index eefbe246..25cbec46 100644 --- a/app/src/main/res/layout/custom_repository_transfer_dialog.xml +++ b/app/src/main/res/layout/custom_repository_transfer_dialog.xml @@ -105,7 +105,7 @@ android:layout_marginTop="@dimen/dimen16dp" android:backgroundTint="@color/darkRed" android:text="@string/repoTransferText" - android:textColor="?attr/materialCardBackgroundColor" + android:textColor="@color/colorWhite" android:textSize="16sp" android:textStyle="bold"/> diff --git a/app/src/main/res/layout/list_account_settings_emails.xml b/app/src/main/res/layout/list_account_settings_emails.xml index 8573711f..24be9070 100644 --- a/app/src/main/res/layout/list_account_settings_emails.xml +++ b/app/src/main/res/layout/list_account_settings_emails.xml @@ -18,30 +18,62 @@ style="?attr/materialCardViewFilledStyle"> - + android:layout_weight=".2" + android:gravity="end" + android:visibility="gone"> + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 74b1206f..d9314b78 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -371,6 +371,8 @@ Email address is already in use Primary SSH Keys + This action will permanently delete email %s from your account. + Email deleted successfully