From 8fd3bc9d908a4cfb19ff7c3bd2068d0891ca3f11 Mon Sep 17 00:00:00 2001 From: M M Arif Date: Sat, 21 Sep 2024 18:44:13 +0000 Subject: [PATCH] Add attachments to comment (#1384) Closes #1340 Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/1384 Co-authored-by: M M Arif Co-committed-by: M M Arif --- README.md | 2 +- .../activities/CreateIssueActivity.java | 1 + .../activities/IssueDetailActivity.java | 281 ++++++++++++++---- .../gitnex/adapters/AttachmentsAdapter.java | 5 + .../adapters/MostVisitedReposAdapter.java | 5 + .../mian/gitnex/adapters/NotesAdapter.java | 5 + .../adapters/OrganizationsListAdapter.java | 11 +- .../fragments/ExploreIssuesFragment.java | 80 +++-- .../ExploreRepositoriesFragment.java | 134 +++++---- .../fragments/ExploreUsersFragment.java | 116 +++++--- .../fragments/MostVisitedReposFragment.java | 126 ++++---- .../gitnex/fragments/MyIssuesFragment.java | 81 +++-- .../fragments/MyRepositoriesFragment.java | 77 +++-- .../mian/gitnex/fragments/NotesFragment.java | 122 ++++---- .../fragments/OrganizationsFragment.java | 76 +++-- .../fragments/RepositoriesFragment.java | 77 +++-- .../StarredRepositoriesFragment.java | 77 +++-- .../WatchedRepositoriesFragment.java | 77 +++-- .../main/res/drawable/shape_full_circle.xml | 2 +- app/src/main/res/drawable/shape_inputs.xml | 2 +- .../main/res/layout/activity_issue_detail.xml | 26 +- .../main/res/layout/fragment_repo_info.xml | 2 +- app/src/main/res/layout/nav_user_accounts.xml | 1 + 23 files changed, 880 insertions(+), 506 deletions(-) diff --git a/README.md b/README.md index f664148c..4ca691bf 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ Thanks to all the open source libraries, contributors, and donors. - [square/retrofit](https://github.com/square/retrofit) - [google/gson](https://github.com/google/gson) - [square/okhttp](https://github.com/square/okhttp) -- [square/picasso](https://github.com/square/picasso) +- [bumptech/glide](https://github.com/bumptech/glide) - [noties/Markwon](https://github.com/noties/Markwon) - [ocpsoft/prettytime](https://github.com/ocpsoft/prettytime) - [ramseth001/TextDrawable](https://github.com/ramseth001/TextDrawable) diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java index 56780b9d..944adf1c 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java @@ -309,6 +309,7 @@ public class CreateIssueActivity extends BaseActivity bottomSheetDialog.setContentView(bottomSheetAttachmentsBinding.getRoot()); bottomSheetDialog.show(); } else { + attachmentsAdapter.clearAdapter(); openFileAttachmentActivity(); } } 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 be0348cd..1b6ddd1f 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -9,6 +9,7 @@ import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -41,9 +42,11 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; +import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.card.MaterialCardView; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.vdurmont.emoji.EmojiParser; +import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.text.DateFormat; @@ -55,9 +58,13 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Objects; +import okhttp3.MediaType; +import okhttp3.RequestBody; import okhttp3.ResponseBody; import org.apache.commons.io.FilenameUtils; import org.gitnex.tea4j.v2.models.Attachment; +import org.gitnex.tea4j.v2.models.Comment; +import org.gitnex.tea4j.v2.models.CreateIssueCommentOption; import org.gitnex.tea4j.v2.models.EditIssueOption; import org.gitnex.tea4j.v2.models.Issue; import org.gitnex.tea4j.v2.models.IssueLabelsOption; @@ -72,17 +79,19 @@ import org.mian.gitnex.actions.AssigneesActions; import org.mian.gitnex.actions.IssueActions; import org.mian.gitnex.actions.LabelsActions; import org.mian.gitnex.adapters.AssigneesListAdapter; +import org.mian.gitnex.adapters.AttachmentsAdapter; import org.mian.gitnex.adapters.IssueCommentsAdapter; import org.mian.gitnex.adapters.LabelsListAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityIssueDetailBinding; +import org.mian.gitnex.databinding.BottomSheetAttachmentsBinding; import org.mian.gitnex.databinding.CustomAssigneesSelectionDialogBinding; import org.mian.gitnex.databinding.CustomImageViewDialogBinding; import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding; import org.mian.gitnex.databinding.CustomPrInfoDialogBinding; -import org.mian.gitnex.fragments.BottomSheetReplyFragment; import org.mian.gitnex.fragments.BottomSheetSingleIssueFragment; import org.mian.gitnex.fragments.IssuesFragment; +import org.mian.gitnex.fragments.PullRequestsFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppDatabaseSettings; import org.mian.gitnex.helpers.AppUtil; @@ -91,9 +100,12 @@ import org.mian.gitnex.helpers.ColorInverter; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.LabelWidthCalculator; import org.mian.gitnex.helpers.Markdown; +import org.mian.gitnex.helpers.SnackBar; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.attachments.AttachmentUtils; +import org.mian.gitnex.helpers.attachments.AttachmentsModel; import org.mian.gitnex.helpers.contexts.IssueContext; import org.mian.gitnex.notifications.Notifications; import org.mian.gitnex.structs.BottomSheetListener; @@ -109,7 +121,8 @@ import retrofit2.Response; public class IssueDetailActivity extends BaseActivity implements LabelsListAdapter.LabelsListAdapterListener, AssigneesListAdapter.AssigneesListAdapterListener, - BottomSheetListener { + BottomSheetListener, + AttachmentsAdapter.AttachmentsReceiverListener { private Typeface myTypeface; public static boolean singleIssueUpdate = false; @@ -144,12 +157,34 @@ public class IssueDetailActivity extends BaseActivity private int page = 1; private TinyDB tinyDB; private Mode mode = Mode.SEND; + private static List attachmentsList; + private AttachmentsAdapter attachmentsAdapter; + private static final List contentUri = new ArrayList<>(); + private InputMethodManager imm; + private float buttonAlphaStatDisabled = .5F; + private float buttonAlphaStatEnabled = 1F; private enum Mode { EDIT, SEND } + ActivityResultLauncher startActivityForResult = + registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == Activity.RESULT_OK) { + Intent data = result.getData(); + assert data != null; + contentUri.add(data.getData()); + attachmentsList.add( + new AttachmentsModel( + AttachmentUtils.queryName(ctx, data.getData()), + data.getData())); + attachmentsAdapter.updateList(attachmentsList); + } + }); + public ActivityResultLauncher editIssueLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), @@ -299,8 +334,7 @@ public class IssueDetailActivity extends BaseActivity Objects.requireNonNull(getSupportActionBar()).setTitle(repoName); getSupportActionBar().setDisplayHomeAsUpEnabled(true); - InputMethodManager imm = - (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); + imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); String instanceUrl = ((BaseActivity) ctx).getAccount().getAccount().getInstanceUrl(); instanceUrlOnly = instanceUrl.substring(0, instanceUrl.lastIndexOf("api/v1/")); @@ -316,19 +350,15 @@ public class IssueDetailActivity extends BaseActivity viewBinding.recyclerView.setNestedScrollingEnabled(false); viewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(ctx)); - float buttonAlphaStatDisabled = .5F; - float buttonAlphaStatEnabled = 1F; + attachmentsList = new ArrayList<>(); + attachmentsAdapter = new AttachmentsAdapter(attachmentsList, ctx); + + AttachmentsAdapter.setAttachmentsReceiveListener(this); viewBinding.send.setAlpha(buttonAlphaStatDisabled); viewBinding.send.setEnabled(false); - viewBinding.addNewComment.setOnClickListener( - v -> { - BottomSheetReplyFragment bottomSheetReplyFragment = - BottomSheetReplyFragment.newInstance(new Bundle(), issue); - bottomSheetReplyFragment.setOnInteractedListener(this::onResume); - bottomSheetReplyFragment.show(getSupportFragmentManager(), "replyBottomSheet"); - }); + viewBinding.addAttachments.setOnClickListener(addAttachments -> checkForAttachments()); labelsAdapter = new LabelsListAdapter(labelsList, IssueDetailActivity.this, currentLabelsIds); @@ -442,43 +472,10 @@ public class IssueDetailActivity extends BaseActivity mode = Mode.SEND; } + Log.e("replyCommentId", String.valueOf(tinyDB.getInt("commentId"))); if (mode == Mode.SEND) { - IssueActions.reply( - ctx, viewBinding.commentReply.getText().toString(), issue) - .accept( - (status, result) -> { - if (status == ActionResult.Status.SUCCESS) { - - viewBinding.scrollViewComments.post( - () -> - issueCommentsModel - .loadIssueComments( - repoOwner, - repoName, - issueIndex, - ctx, - () -> - viewBinding - .scrollViewComments - .fullScroll( - ScrollView - .FOCUS_DOWN))); - - Toasty.success( - ctx, getString(R.string.commentSuccess)); - - viewBinding.send.setAlpha(buttonAlphaStatDisabled); - viewBinding.send.setEnabled(false); - viewBinding.commentReply.setText(null); - viewBinding.commentReply.clearFocus(); - imm.toggleSoftInput( - InputMethodManager.HIDE_IMPLICIT_ONLY, 0); - } else { - - Toasty.error(ctx, getString(R.string.genericError)); - } - }); + createIssueComment(viewBinding.commentReply.getText().toString()); } else { IssueActions.edit( @@ -490,6 +487,13 @@ public class IssueDetailActivity extends BaseActivity (status, result) -> { if (status == ActionResult.Status.SUCCESS) { + if (!contentUri.isEmpty()) { + processAttachments(tinyDB.getInt("commentId")); + contentUri.clear(); + AttachmentsAdapter + .setAttachmentsReceiveListener(null); + } + tinyDB.remove("commentId"); tinyDB.remove("commentAction"); @@ -523,6 +527,103 @@ public class IssueDetailActivity extends BaseActivity }); } + public void onDestroy() { + AttachmentsAdapter.setAttachmentsReceiveListener(null); + super.onDestroy(); + } + + @Override + public void setAttachmentsData(Uri filename) { + contentUri.remove(filename); + } + + private void checkForAttachments() { + + if (!contentUri.isEmpty()) { + + BottomSheetAttachmentsBinding bottomSheetAttachmentsBinding = + BottomSheetAttachmentsBinding.inflate(getLayoutInflater()); + + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(ctx); + + bottomSheetAttachmentsBinding.addAttachment.setOnClickListener( + v1 -> openFileAttachmentActivity()); + + bottomSheetAttachmentsBinding.recyclerViewAttachments.setHasFixedSize(true); + bottomSheetAttachmentsBinding.recyclerViewAttachments.setLayoutManager( + new LinearLayoutManager(ctx)); + bottomSheetAttachmentsBinding.recyclerViewAttachments.setAdapter(attachmentsAdapter); + + bottomSheetDialog.setContentView(bottomSheetAttachmentsBinding.getRoot()); + bottomSheetDialog.show(); + } else { + attachmentsAdapter.clearAdapter(); + openFileAttachmentActivity(); + } + } + + private void openFileAttachmentActivity() { + + Intent data = new Intent(Intent.ACTION_GET_CONTENT); + data.addCategory(Intent.CATEGORY_OPENABLE); + data.setType("*/*"); + Intent intent = Intent.createChooser(data, "Choose a file"); + startActivityForResult.launch(intent); + } + + public void processAttachments(long commentId) { + + for (int i = 0; i < contentUri.size(); i++) { + + File file = AttachmentUtils.getFile(ctx, contentUri.get(i)); + + RequestBody requestFile = + RequestBody.create( + file, + MediaType.parse( + Objects.requireNonNull( + getContentResolver().getType(contentUri.get(i))))); + + uploadAttachments(requestFile, commentId, file.getName()); + } + } + + private void uploadAttachments(RequestBody requestFile, long commentId, String filename1) { + + Call call3; + call3 = + RetrofitClient.getApiInterface(ctx) + .issueCreateIssueCommentAttachment( + requestFile, repoOwner, repoName, commentId, filename1); + + call3.enqueue( + new Callback<>() { + + @Override + public void onResponse( + @NonNull Call call, + @NonNull retrofit2.Response response2) { + + if (response2.code() == 201) { + Log.e("Attachments", "Files uploaded"); + } + if (response2.code() == 401) { + + AlertDialogs.authorizationTokenRevokedDialog(ctx); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + SnackBar.error( + ctx, + findViewById(android.R.id.content), + getString(R.string.genericServerResponseError)); + } + }); + } + @Override public void onButtonClicked(String text) { @@ -786,6 +887,7 @@ public class IssueDetailActivity extends BaseActivity startActivity(intent); } finish(); + contentUri.clear(); return true; } else if (id == R.id.genericMenu) { @@ -870,8 +972,8 @@ public class IssueDetailActivity extends BaseActivity 500); } - tinyDB.remove("commentId"); - tinyDB.remove("commentAction"); + // tinyDB.remove("commentId"); + // tinyDB.remove("commentAction"); mode = Mode.SEND; } @@ -1602,4 +1704,83 @@ public class IssueDetailActivity extends BaseActivity materialAlertDialogBuilder.create().show(); } + + private void createIssueComment(String comment) { + + CreateIssueCommentOption issueComment = new CreateIssueCommentOption(); + issueComment.setBody(comment); + + Call call = + RetrofitClient.getApiInterface(ctx) + .issueCreateComment( + issue.getRepository().getOwner(), + issue.getRepository().getName(), + (long) issue.getIssueIndex(), + issueComment); + + call.enqueue( + new Callback<>() { + + @Override + public void onResponse( + @NonNull Call call, + @NonNull retrofit2.Response response) { + + if (response.code() == 201) { + + assert response.body() != null; + + if (issue.hasIssue()) { + IssuesFragment.resumeIssues = + issue.getIssue().getPullRequest() == null; + PullRequestsFragment.resumePullRequests = + issue.getIssue().getPullRequest() != null; + } + + if (!contentUri.isEmpty()) { + processAttachments(response.body().getId()); + contentUri.clear(); + AttachmentsAdapter.setAttachmentsReceiveListener(null); + } + + viewBinding.scrollViewComments.post( + () -> + issueCommentsModel.loadIssueComments( + repoOwner, + repoName, + issueIndex, + ctx, + () -> + viewBinding.scrollViewComments + .fullScroll( + ScrollView + .FOCUS_DOWN))); + + Toasty.success(ctx, getString(R.string.commentSuccess)); + + viewBinding.send.setAlpha(buttonAlphaStatDisabled); + viewBinding.send.setEnabled(false); + viewBinding.commentReply.setText(null); + viewBinding.commentReply.clearFocus(); + imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); + + } else if (response.code() == 401) { + + AlertDialogs.authorizationTokenRevokedDialog(ctx); + + } else { + + Toasty.error(ctx, getString(R.string.genericError)); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + Toasty.error( + ctx, + ctx.getResources().getString(R.string.genericServerResponseError)); + } + }); + } } diff --git a/app/src/main/java/org/mian/gitnex/adapters/AttachmentsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/AttachmentsAdapter.java index 1d759ee7..fb78cdc7 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/AttachmentsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/AttachmentsAdapter.java @@ -114,6 +114,11 @@ public class AttachmentsAdapter extends RecyclerView.Adapter new Handler(Looper.getMainLooper()) @@ -103,35 +150,4 @@ public class ExploreIssuesFragment extends Fragment { viewBinding.progressBar.setVisibility(View.GONE); }); } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - menu.clear(); - inflater.inflate(R.menu.search_menu, menu); - super.onCreateOptionsMenu(menu, inflater); - - MenuItem searchItem = menu.findItem(R.id.action_search); - androidx.appcompat.widget.SearchView searchView = - (androidx.appcompat.widget.SearchView) searchItem.getActionView(); - searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new androidx.appcompat.widget.SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - viewBinding.progressBar.setVisibility(View.VISIBLE); - fetchDataAsync(query); - searchView.setQuery(null, false); - searchItem.collapseActionView(); - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - return false; - } - }); - } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java index a12ed21a..2b8d68fa 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java @@ -12,7 +12,9 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.recyclerview.widget.LinearLayoutManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.ArrayList; @@ -60,7 +62,6 @@ public class ExploreRepositoriesFragment extends Fragment { @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { viewBinding = FragmentExploreRepoBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); context = getContext(); dataList = new ArrayList<>(); @@ -68,6 +69,81 @@ public class ExploreRepositoriesFragment extends Fragment { resultLimit = Constants.getCurrentResultLimit(context); + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + + menu.clear(); + menuInflater.inflate(R.menu.search_menu, menu); + menuInflater.inflate(R.menu.filter_menu_explore, menu); + MenuItem filter = menu.findItem(R.id.filter_explore); + + filter.setOnMenuItemClickListener( + filter_ -> { + showFilterOptions(); + return false; + }); + + MenuItem searchItem = menu.findItem(R.id.action_search); + androidx.appcompat.widget.SearchView searchView = + (androidx.appcompat.widget.SearchView) + searchItem.getActionView(); + assert searchView != null; + searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); + + searchView.setOnQueryTextListener( + new androidx.appcompat.widget.SearchView + .OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + viewBinding.progressBar.setVisibility(View.VISIBLE); + loadInitial(query, resultLimit); + adapter.setLoadMoreListener( + () -> + viewBinding.recyclerViewReposSearch + .post( + () -> { + if (dataList + .size() + == resultLimit + || pageSize + == resultLimit) { + int page = + (dataList + .size() + + resultLimit) + / resultLimit; + loadMore( + query, + resultLimit, + page); + } + })); + searchQuery = query; + searchView.setQuery(null, false); + searchItem.collapseActionView(); + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + viewBinding.pullToRefresh.setOnRefreshListener( () -> new Handler(Looper.getMainLooper()) @@ -127,7 +203,7 @@ public class ExploreRepositoriesFragment extends Fragment { @NonNull Call call, @NonNull Response response) { if (response.isSuccessful()) { - if (response.body() != null && response.body().getData().size() > 0) { + if (response.body() != null && !response.body().getData().isEmpty()) { dataList.clear(); dataList.addAll(response.body().getData()); adapter.notifyDataChanged(); @@ -195,7 +271,7 @@ public class ExploreRepositoriesFragment extends Fragment { if (response.isSuccessful()) { assert response.body() != null; List result = response.body().getData(); - if (result.size() > 0) { + if (!result.isEmpty()) { pageSize = result.size(); dataList.addAll(result); } else { @@ -228,58 +304,6 @@ public class ExploreRepositoriesFragment extends Fragment { }); } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - menu.clear(); - inflater.inflate(R.menu.search_menu, menu); - inflater.inflate(R.menu.filter_menu_explore, menu); - super.onCreateOptionsMenu(menu, inflater); - MenuItem filter = menu.findItem(R.id.filter_explore); - - filter.setOnMenuItemClickListener( - filter_ -> { - showFilterOptions(); - return false; - }); - - MenuItem searchItem = menu.findItem(R.id.action_search); - androidx.appcompat.widget.SearchView searchView = - (androidx.appcompat.widget.SearchView) searchItem.getActionView(); - searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new androidx.appcompat.widget.SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - viewBinding.progressBar.setVisibility(View.VISIBLE); - loadInitial(query, resultLimit); - adapter.setLoadMoreListener( - () -> - viewBinding.recyclerViewReposSearch.post( - () -> { - if (dataList.size() == resultLimit - || pageSize == resultLimit) { - int page = - (dataList.size() + resultLimit) - / resultLimit; - loadMore(query, resultLimit, page); - } - })); - searchQuery = query; - searchView.setQuery(null, false); - searchItem.collapseActionView(); - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - return false; - } - }); - } - private void showFilterOptions() { MaterialAlertDialogBuilder materialAlertDialogBuilder = diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExploreUsersFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExploreUsersFragment.java index e37ce773..859d7a08 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExploreUsersFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExploreUsersFragment.java @@ -12,7 +12,9 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.recyclerview.widget.LinearLayoutManager; import java.util.ArrayList; import java.util.List; @@ -48,13 +50,78 @@ public class ExploreUsersFragment extends Fragment { viewBinding = FragmentExploreUsersBinding.inflate(inflater, container, false); context = getContext(); - setHasOptionsMenu(true); resultLimit = Constants.getCurrentResultLimit(context); usersList = new ArrayList<>(); adapter = new UsersAdapter(usersList, context); + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + + menu.clear(); + menuInflater.inflate(R.menu.search_menu, menu); + + MenuItem searchItem = menu.findItem(R.id.action_search); + androidx.appcompat.widget.SearchView searchView = + (androidx.appcompat.widget.SearchView) + searchItem.getActionView(); + assert searchView != null; + searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); + + searchView.setOnQueryTextListener( + new androidx.appcompat.widget.SearchView + .OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + viewBinding.progressBar.setVisibility(View.VISIBLE); + loadInitial(query, resultLimit); + adapter.setLoadMoreListener( + () -> + viewBinding.recyclerViewExploreUsers + .post( + () -> { + if (usersList + .size() + == resultLimit + || pageSize + == resultLimit) { + int page = + (usersList + .size() + + resultLimit) + / resultLimit; + loadMore( + query, + resultLimit, + page); + } + })); + searchView.setQuery(null, false); + searchItem.collapseActionView(); + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + viewBinding.pullToRefresh.setOnRefreshListener( () -> new Handler(Looper.getMainLooper()) @@ -99,7 +166,7 @@ public class ExploreUsersFragment extends Fragment { @NonNull Call call, @NonNull Response response) { if (response.isSuccessful()) { - if (response.body() != null && response.body().getData().size() > 0) { + if (response.body() != null && !response.body().getData().isEmpty()) { usersList.clear(); usersList.addAll(response.body().getData()); adapter.notifyDataChanged(); @@ -152,7 +219,7 @@ public class ExploreUsersFragment extends Fragment { assert response.body() != null; List result = response.body().getData(); if (result != null) { - if (result.size() > 0) { + if (!result.isEmpty()) { pageSize = result.size(); usersList.addAll(result); } else { @@ -186,47 +253,4 @@ public class ExploreUsersFragment extends Fragment { } }); } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - menu.clear(); - inflater.inflate(R.menu.search_menu, menu); - super.onCreateOptionsMenu(menu, inflater); - - MenuItem searchItem = menu.findItem(R.id.action_search); - androidx.appcompat.widget.SearchView searchView = - (androidx.appcompat.widget.SearchView) searchItem.getActionView(); - searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new androidx.appcompat.widget.SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - viewBinding.progressBar.setVisibility(View.VISIBLE); - loadInitial(query, resultLimit); - adapter.setLoadMoreListener( - () -> - viewBinding.recyclerViewExploreUsers.post( - () -> { - if (usersList.size() == resultLimit - || pageSize == resultLimit) { - int page = - (usersList.size() + resultLimit) - / resultLimit; - loadMore(query, resultLimit, page); - } - })); - searchView.setQuery(null, false); - searchItem.collapseActionView(); - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - return false; - } - }); - } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/MostVisitedReposFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MostVisitedReposFragment.java index 93a438c5..3e7a63f4 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MostVisitedReposFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MostVisitedReposFragment.java @@ -13,7 +13,9 @@ import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; import androidx.appcompat.widget.SearchView; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.recyclerview.widget.LinearLayoutManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.ArrayList; @@ -48,7 +50,6 @@ public class MostVisitedReposFragment extends Fragment { fragmentDraftsBinding = FragmentDraftsBinding.inflate(inflater, container, false); ctx = getContext(); - setHasOptionsMenu(true); ((MainActivity) requireActivity()) .setActionBarTitle(getResources().getString(R.string.navMostVisited)); @@ -75,6 +76,69 @@ public class MostVisitedReposFragment extends Fragment { fetchDataAsync(currentActiveAccountId); + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + + menuInflater.inflate(R.menu.reset_menu, menu); + menuInflater.inflate(R.menu.search_menu, menu); + + MenuItem searchItem = menu.findItem(R.id.action_search); + SearchView searchView = (SearchView) searchItem.getActionView(); + Objects.requireNonNull(searchView) + .setImeOptions(EditorInfo.IME_ACTION_DONE); + + searchView.setOnQueryTextListener( + new SearchView.OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + + filter(newText); + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + + if (menuItem.getItemId() == R.id.reset_menu_item) { + + if (mostVisitedReposList.isEmpty()) { + Toasty.warning( + ctx, + getResources().getString(R.string.noDataFound)); + } else { + new MaterialAlertDialogBuilder(ctx) + .setTitle(R.string.reset) + .setMessage(R.string.resetCounterAllDialogMessage) + .setPositiveButton( + R.string.reset, + (dialog, which) -> { + resetAllRepositoryCounter( + currentActiveAccountId); + dialog.dismiss(); + }) + .setNeutralButton(R.string.cancelButton, null) + .show(); + } + } + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + return fragmentDraftsBinding.getRoot(); } @@ -87,7 +151,7 @@ public class MostVisitedReposFragment extends Fragment { mostVisitedRepos -> { fragmentDraftsBinding.pullToRefresh.setRefreshing(false); assert mostVisitedRepos != null; - if (mostVisitedRepos.size() > 0) { + if (!mostVisitedRepos.isEmpty()) { mostVisitedReposList.clear(); fragmentDraftsBinding.noData.setVisibility(View.GONE); @@ -103,72 +167,18 @@ public class MostVisitedReposFragment extends Fragment { public void resetAllRepositoryCounter(int accountId) { - if (mostVisitedReposList.size() > 0) { + if (!mostVisitedReposList.isEmpty()) { Objects.requireNonNull(BaseApi.getInstance(ctx, RepositoriesApi.class)) .resetAllRepositoryMostVisited(accountId); mostVisitedReposList.clear(); - adapter.notifyDataChanged(); + adapter.clearAdapter(); Toasty.success(ctx, getResources().getString(R.string.resetMostReposCounter)); } else { Toasty.warning(ctx, getResources().getString(R.string.noDataFound)); } } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - inflater.inflate(R.menu.reset_menu, menu); - inflater.inflate(R.menu.search_menu, menu); - super.onCreateOptionsMenu(menu, inflater); - - MenuItem searchItem = menu.findItem(R.id.action_search); - SearchView searchView = (SearchView) searchItem.getActionView(); - Objects.requireNonNull(searchView).setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - - filter(newText); - return false; - } - }); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - - if (item.getItemId() == R.id.reset_menu_item) { - - if (mostVisitedReposList.size() == 0) { - Toasty.warning(ctx, getResources().getString(R.string.noDataFound)); - } else { - new MaterialAlertDialogBuilder(ctx) - .setTitle(R.string.reset) - .setMessage(R.string.resetCounterAllDialogMessage) - .setPositiveButton( - R.string.reset, - (dialog, which) -> { - resetAllRepositoryCounter(currentActiveAccountId); - dialog.dismiss(); - }) - .setNeutralButton(R.string.cancelButton, null) - .show(); - } - } - - return super.onOptionsItemSelected(item); - } - private void filter(String text) { List arr = new ArrayList<>(); diff --git a/app/src/main/java/org/mian/gitnex/fragments/MyIssuesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MyIssuesFragment.java index 05909375..659bda6e 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MyIssuesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MyIssuesFragment.java @@ -11,7 +11,9 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import org.mian.gitnex.R; @@ -38,7 +40,52 @@ public class MyIssuesFragment extends Fragment { @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { fragmentIssuesBinding = FragmentIssuesBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); + + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu1, @NonNull MenuInflater menuInflater) { + + menu = menu1; + menuInflater.inflate(R.menu.search_menu, menu1); + menuInflater.inflate(R.menu.filter_menu, menu1); + + MenuItem searchItem = menu1.findItem(R.id.action_search); + androidx.appcompat.widget.SearchView searchView = + (androidx.appcompat.widget.SearchView) + searchItem.getActionView(); + assert searchView != null; + searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); + + searchView.setOnQueryTextListener( + new androidx.appcompat.widget.SearchView + .OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + fetchDataAsync(query, state, assignedToMe); + searchView.setQuery(null, false); + searchItem.collapseActionView(); + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + issuesViewModel = new ViewModelProvider(this).get(IssuesViewModel.class); fragmentIssuesBinding.recyclerView.setHasFixedSize(true); @@ -137,36 +184,4 @@ public class MyIssuesFragment extends Fragment { fragmentIssuesBinding.progressBar.setVisibility(View.GONE); }); } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - this.menu = menu; - inflater.inflate(R.menu.search_menu, menu); - inflater.inflate(R.menu.filter_menu, menu); - super.onCreateOptionsMenu(menu, inflater); - - MenuItem searchItem = menu.findItem(R.id.action_search); - androidx.appcompat.widget.SearchView searchView = - (androidx.appcompat.widget.SearchView) searchItem.getActionView(); - assert searchView != null; - searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new androidx.appcompat.widget.SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - fetchDataAsync(query, state, assignedToMe); - searchView.setQuery(null, false); - searchItem.collapseActionView(); - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - return false; - } - }); - } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/MyRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MyRepositoriesFragment.java index cb924e59..c44389ea 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MyRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MyRepositoriesFragment.java @@ -12,7 +12,9 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import org.mian.gitnex.R; @@ -41,7 +43,51 @@ public class MyRepositoriesFragment extends Fragment { fragmentRepositoriesBinding = FragmentRepositoriesBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); + + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + menuInflater.inflate(R.menu.search_menu, menu); + + MenuItem searchItem = menu.findItem(R.id.action_search); + androidx.appcompat.widget.SearchView searchView = + (androidx.appcompat.widget.SearchView) + searchItem.getActionView(); + assert searchView != null; + searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); + + searchView.setOnQueryTextListener( + new androidx.appcompat.widget.SearchView + .OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + if (fragmentRepositoriesBinding.recyclerView + .getAdapter() + != null) { + adapter.getFilter().filter(newText); + } + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + ((MainActivity) requireActivity()) .setActionBarTitle(getResources().getString(R.string.navMyRepos)); repositoriesViewModel = new ViewModelProvider(this).get(RepositoriesViewModel.class); @@ -150,33 +196,4 @@ public class MyRepositoriesFragment extends Fragment { MainActivity.reloadRepos = false; } } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - inflater.inflate(R.menu.search_menu, menu); - super.onCreateOptionsMenu(menu, inflater); - - MenuItem searchItem = menu.findItem(R.id.action_search); - androidx.appcompat.widget.SearchView searchView = - (androidx.appcompat.widget.SearchView) searchItem.getActionView(); - searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new androidx.appcompat.widget.SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - if (fragmentRepositoriesBinding.recyclerView.getAdapter() != null) { - adapter.getFilter().filter(newText); - } - return false; - } - }); - } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/NotesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/NotesFragment.java index 07e06aae..b8c271a2 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/NotesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/NotesFragment.java @@ -14,7 +14,9 @@ import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; import androidx.appcompat.widget.SearchView; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.recyclerview.widget.LinearLayoutManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.ArrayList; @@ -48,7 +50,68 @@ public class NotesFragment extends Fragment { binding = FragmentNotesBinding.inflate(inflater, container, false); ctx = getContext(); - setHasOptionsMenu(true); + + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + + menuInflater.inflate(R.menu.reset_menu, menu); + menuInflater.inflate(R.menu.search_menu, menu); + + MenuItem searchItem = menu.findItem(R.id.action_search); + SearchView searchView = (SearchView) searchItem.getActionView(); + assert searchView != null; + searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); + + searchView.setOnQueryTextListener( + new SearchView.OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + + filter(newText); + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + + if (menuItem.getItemId() == R.id.reset_menu_item) { + + if (notesList.isEmpty()) { + Toasty.warning( + ctx, + getResources().getString(R.string.noDataFound)); + } else { + new MaterialAlertDialogBuilder(ctx) + .setTitle(R.string.menuDeleteText) + .setMessage(R.string.notesAllDeletionMessage) + .setPositiveButton( + R.string.menuDeleteText, + (dialog, which) -> { + deleteAllNotes(); + dialog.dismiss(); + }) + .setNeutralButton(R.string.cancelButton, null) + .show(); + } + } + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); ((MainActivity) requireActivity()) .setActionBarTitle(getResources().getString(R.string.navNotes)); @@ -142,66 +205,11 @@ public class NotesFragment extends Fragment { notesApi.deleteAllNotes(); notesList.clear(); - adapter.notifyDataChanged(); + adapter.clearAdapter(); Toasty.success( ctx, ctx.getResources().getQuantityString(R.plurals.noteDeleteMessage, 2)); } else { Toasty.warning(ctx, getResources().getString(R.string.noDataFound)); } } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - inflater.inflate(R.menu.reset_menu, menu); - inflater.inflate(R.menu.search_menu, menu); - super.onCreateOptionsMenu(menu, inflater); - - MenuItem searchItem = menu.findItem(R.id.action_search); - SearchView searchView = (SearchView) searchItem.getActionView(); - assert searchView != null; - searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - - filter(newText); - return false; - } - }); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - - if (item.getItemId() == R.id.reset_menu_item) { - - if (notesList.isEmpty()) { - Toasty.warning(ctx, getResources().getString(R.string.noDataFound)); - } else { - new MaterialAlertDialogBuilder(ctx) - .setTitle(R.string.menuDeleteText) - .setMessage(R.string.notesAllDeletionMessage) - .setPositiveButton( - R.string.menuDeleteText, - (dialog, which) -> { - deleteAllNotes(); - dialog.dismiss(); - }) - .setNeutralButton(R.string.cancelButton, null) - .show(); - } - } - - return super.onOptionsItemSelected(item); - } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/OrganizationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/OrganizationsFragment.java index 7549fc19..b0512010 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/OrganizationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/OrganizationsFragment.java @@ -12,7 +12,9 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import org.mian.gitnex.R; @@ -42,7 +44,50 @@ public class OrganizationsFragment extends Fragment { fragmentOrganizationsBinding = FragmentOrganizationsBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + menuInflater.inflate(R.menu.search_menu, menu); + + MenuItem searchItem = menu.findItem(R.id.action_search); + androidx.appcompat.widget.SearchView searchView = + (androidx.appcompat.widget.SearchView) + searchItem.getActionView(); + assert searchView != null; + searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); + + searchView.setOnQueryTextListener( + new androidx.appcompat.widget.SearchView + .OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + if (fragmentOrganizationsBinding.recyclerView + .getAdapter() + != null) { + adapter.getFilter().filter(newText); + } + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + ((MainActivity) requireActivity()) .setActionBarTitle(getResources().getString(R.string.navOrg)); organizationsViewModel = new ViewModelProvider(this).get(OrganizationsViewModel.class); @@ -132,33 +177,4 @@ public class OrganizationsFragment extends Fragment { orgCreated = false; } } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - inflater.inflate(R.menu.search_menu, menu); - super.onCreateOptionsMenu(menu, inflater); - - MenuItem searchItem = menu.findItem(R.id.action_search); - androidx.appcompat.widget.SearchView searchView = - (androidx.appcompat.widget.SearchView) searchItem.getActionView(); - searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new androidx.appcompat.widget.SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - if (fragmentOrganizationsBinding.recyclerView.getAdapter() != null) { - adapter.getFilter().filter(newText); - } - return false; - } - }); - } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java index 96651d85..8175f1f3 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java @@ -12,7 +12,9 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import org.mian.gitnex.R; @@ -40,7 +42,51 @@ public class RepositoriesFragment extends Fragment { fragmentRepositoriesBinding = FragmentRepositoriesBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); + + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + menuInflater.inflate(R.menu.search_menu, menu); + + MenuItem searchItem = menu.findItem(R.id.action_search); + androidx.appcompat.widget.SearchView searchView = + (androidx.appcompat.widget.SearchView) + searchItem.getActionView(); + assert searchView != null; + searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); + + searchView.setOnQueryTextListener( + new androidx.appcompat.widget.SearchView + .OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + if (fragmentRepositoriesBinding.recyclerView + .getAdapter() + != null) { + adapter.getFilter().filter(newText); + } + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + ((MainActivity) requireActivity()) .setActionBarTitle(getResources().getString(R.string.navRepos)); repositoriesViewModel = new ViewModelProvider(this).get(RepositoriesViewModel.class); @@ -141,33 +187,4 @@ public class RepositoriesFragment extends Fragment { MainActivity.reloadRepos = false; } } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - inflater.inflate(R.menu.search_menu, menu); - super.onCreateOptionsMenu(menu, inflater); - - MenuItem searchItem = menu.findItem(R.id.action_search); - androidx.appcompat.widget.SearchView searchView = - (androidx.appcompat.widget.SearchView) searchItem.getActionView(); - searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new androidx.appcompat.widget.SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - if (fragmentRepositoriesBinding.recyclerView.getAdapter() != null) { - adapter.getFilter().filter(newText); - } - return false; - } - }); - } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java index 5a66ff33..538f8b7f 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java @@ -12,7 +12,9 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import org.mian.gitnex.R; @@ -40,7 +42,51 @@ public class StarredRepositoriesFragment extends Fragment { fragmentRepositoriesBinding = FragmentRepositoriesBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); + + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + menuInflater.inflate(R.menu.search_menu, menu); + + MenuItem searchItem = menu.findItem(R.id.action_search); + androidx.appcompat.widget.SearchView searchView = + (androidx.appcompat.widget.SearchView) + searchItem.getActionView(); + assert searchView != null; + searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); + + searchView.setOnQueryTextListener( + new androidx.appcompat.widget.SearchView + .OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + if (fragmentRepositoriesBinding.recyclerView + .getAdapter() + != null) { + adapter.getFilter().filter(newText); + } + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + ((MainActivity) requireActivity()) .setActionBarTitle(getResources().getString(R.string.navStarredRepos)); repositoriesViewModel = new ViewModelProvider(this).get(RepositoriesViewModel.class); @@ -134,35 +180,6 @@ public class StarredRepositoriesFragment extends Fragment { }); } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - inflater.inflate(R.menu.search_menu, menu); - super.onCreateOptionsMenu(menu, inflater); - - MenuItem searchItem = menu.findItem(R.id.action_search); - androidx.appcompat.widget.SearchView searchView = - (androidx.appcompat.widget.SearchView) searchItem.getActionView(); - searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new androidx.appcompat.widget.SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - if (fragmentRepositoriesBinding.recyclerView.getAdapter() != null) { - adapter.getFilter().filter(newText); - } - return false; - } - }); - } - @Override public void onResume() { super.onResume(); diff --git a/app/src/main/java/org/mian/gitnex/fragments/WatchedRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/WatchedRepositoriesFragment.java index 9c0d0d4f..344dfed8 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/WatchedRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/WatchedRepositoriesFragment.java @@ -12,7 +12,9 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import org.mian.gitnex.R; @@ -40,7 +42,51 @@ public class WatchedRepositoriesFragment extends Fragment { fragmentRepositoriesBinding = FragmentRepositoriesBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); + + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + menuInflater.inflate(R.menu.search_menu, menu); + + MenuItem searchItem = menu.findItem(R.id.action_search); + androidx.appcompat.widget.SearchView searchView = + (androidx.appcompat.widget.SearchView) + searchItem.getActionView(); + assert searchView != null; + searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); + + searchView.setOnQueryTextListener( + new androidx.appcompat.widget.SearchView + .OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + if (fragmentRepositoriesBinding.recyclerView + .getAdapter() + != null) { + adapter.getFilter().filter(newText); + } + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + ((MainActivity) requireActivity()) .setActionBarTitle(getResources().getString(R.string.navWatchedRepositories)); repositoriesViewModel = new ViewModelProvider(this).get(RepositoriesViewModel.class); @@ -134,35 +180,6 @@ public class WatchedRepositoriesFragment extends Fragment { }); } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - inflater.inflate(R.menu.search_menu, menu); - super.onCreateOptionsMenu(menu, inflater); - - MenuItem searchItem = menu.findItem(R.id.action_search); - androidx.appcompat.widget.SearchView searchView = - (androidx.appcompat.widget.SearchView) searchItem.getActionView(); - searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - - searchView.setOnQueryTextListener( - new androidx.appcompat.widget.SearchView.OnQueryTextListener() { - - @Override - public boolean onQueryTextSubmit(String query) { - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - if (fragmentRepositoriesBinding.recyclerView.getAdapter() != null) { - adapter.getFilter().filter(newText); - } - return false; - } - }); - } - @Override public void onResume() { super.onResume(); diff --git a/app/src/main/res/drawable/shape_full_circle.xml b/app/src/main/res/drawable/shape_full_circle.xml index cd23384d..8495e78d 100644 --- a/app/src/main/res/drawable/shape_full_circle.xml +++ b/app/src/main/res/drawable/shape_full_circle.xml @@ -2,6 +2,6 @@ - + diff --git a/app/src/main/res/drawable/shape_inputs.xml b/app/src/main/res/drawable/shape_inputs.xml index 97d104ce..1803fa82 100644 --- a/app/src/main/res/drawable/shape_inputs.xml +++ b/app/src/main/res/drawable/shape_inputs.xml @@ -8,7 +8,7 @@ + android:radius="12dp"> - - @@ -399,10 +385,10 @@ android:layout_gravity="center_vertical" android:backgroundTint="?attr/fabColor" android:layout_marginEnd="@dimen/dimen8dp" - app:cardCornerRadius="@dimen/dimen36dp"> + app:cardCornerRadius="@dimen/dimen12dp"> + app:cardCornerRadius="@dimen/dimen12dp">