diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExploreFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExploreFragment.java index fee96786..01e9ca89 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExploreFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExploreFragment.java @@ -18,7 +18,6 @@ import org.mian.gitnex.R; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.helpers.AppDatabaseSettings; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.ViewPager2Transformers; /** @@ -35,7 +34,6 @@ public class ExploreFragment extends Fragment { View view = inflater.inflate(R.layout.fragment_explore, container, false); Context ctx = getContext(); - TinyDB tinyDB = TinyDB.getInstance(ctx); ((MainActivity) requireActivity()) .setActionBarTitle(getResources().getString(R.string.pageTitleExplore)); diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java index 1853a0b7..416c7c8b 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java @@ -105,7 +105,7 @@ public class ExplorePublicOrganizationsFragment extends Fragment { @NonNull Call> call, @NonNull Response> response) { if (response.isSuccessful()) { - if (response.body() != null && response.body().size() > 0) { + if (response.body() != null && !response.body().isEmpty()) { organizationsList.clear(); organizationsList.addAll(response.body()); adapter.notifyDataChanged(); @@ -147,7 +147,7 @@ public class ExplorePublicOrganizationsFragment extends Fragment { if (response.isSuccessful()) { List result = response.body(); if (result != null) { - if (result.size() > 0) { + if (!result.isEmpty()) { pageSize = result.size(); organizationsList.addAll(result); } else { diff --git a/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java index cbf7e16d..90247a85 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java @@ -15,7 +15,9 @@ import android.view.inputmethod.EditorInfo; import androidx.activity.OnBackPressedCallback; 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.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -76,7 +78,6 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentFilesBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); boolean canPush = repository.getPermissions().isPush(); boolean archived = repository.getRepository().isArchived(); @@ -184,6 +185,51 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter binding.switchBranch.setOnClickListener(switchBranch -> chooseBranch()); + requireActivity() + .addMenuProvider( + new MenuProvider() { + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + + menuInflater.inflate(R.menu.search_menu, menu); + menuInflater.inflate(R.menu.files_switch_branches_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 SearchView.OnQueryTextListener() { + + @Override + public boolean onQueryTextChange(String newText) { + + if (binding.recyclerView.getAdapter() != null) { + filesAdapter.getFilter().filter(newText); + } + + return false; + } + + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + return binding.getRoot(); } @@ -415,39 +461,4 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter } }); } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - menu.clear(); - - inflater.inflate(R.menu.search_menu, menu); - inflater.inflate(R.menu.files_switch_branches_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 onQueryTextChange(String newText) { - - if (binding.recyclerView.getAdapter() != null) { - filesAdapter.getFilter().filter(newText); - } - - return false; - } - - @Override - public boolean onQueryTextSubmit(String query) { - return false; - } - }); - } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java index 3e6e4f45..a5ad43a1 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java @@ -13,7 +13,9 @@ import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +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; @@ -41,7 +43,6 @@ public class IssuesFragment extends Fragment { private final String requestType = Constants.issuesRequestType; private FragmentIssuesBinding fragmentIssuesBinding; private Context context; - private Menu menu; private List issuesList; private List pinnedIssuesList; private IssuesAdapter adapter; @@ -63,7 +64,6 @@ public class IssuesFragment extends Fragment { @Nullable Bundle savedInstanceState) { fragmentIssuesBinding = FragmentIssuesBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); context = getContext(); repository = RepositoryContext.fromBundle(requireArguments()); @@ -126,12 +126,6 @@ public class IssuesFragment extends Fragment { ((RepoDetailActivity) requireActivity()) .setFragmentRefreshListener( issueState -> { - if (issueState.equals("closed")) { - menu.getItem(1).setIcon(R.drawable.ic_filter_closed); - } else { - menu.getItem(1).setIcon(R.drawable.ic_filter); - } - issuesList.clear(); adapter = new IssuesAdapter(context, issuesList, ""); @@ -247,6 +241,64 @@ public class IssuesFragment extends Fragment { fragmentIssuesBinding.createNewIssue.setVisibility(View.GONE); } + requireActivity() + .addMenuProvider( + new MenuProvider() { + + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + + menuInflater.inflate(R.menu.search_menu, menu); + menuInflater.inflate(R.menu.filter_menu, menu); + + if (repository.getIssueState().toString().equals("closed")) { + menu.getItem(1).setIcon(R.drawable.ic_filter_closed); + } else { + menu.getItem(1).setIcon(R.drawable.ic_filter); + } + + 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) { + loadInitial( + repository.getOwner(), + repository.getName(), + resultLimit, + requestType, + repository.getIssueState().toString(), + repository.getIssueMilestoneFilterName(), + 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); + return fragmentIssuesBinding.getRoot(); } @@ -439,7 +491,7 @@ public class IssuesFragment extends Fragment { }); } - @Override + /*@Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { this.menu = menu; @@ -481,5 +533,5 @@ public class IssuesFragment extends Fragment { return false; } }); - } + }*/ } diff --git a/app/src/main/java/org/mian/gitnex/fragments/LabelsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/LabelsFragment.java index 3ef7d561..84fe3d6a 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/LabelsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/LabelsFragment.java @@ -53,7 +53,6 @@ public class LabelsFragment extends Fragment { FragmentLabelsBinding fragmentLabelsBinding = FragmentLabelsBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); boolean canPush = repository.getPermissions().isPush(); boolean archived = repository.getRepository().isArchived(); diff --git a/app/src/main/java/org/mian/gitnex/fragments/MilestonesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MilestonesFragment.java index a945e060..f4ef4ed9 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MilestonesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MilestonesFragment.java @@ -13,7 +13,9 @@ import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import java.util.ArrayList; @@ -34,7 +36,6 @@ public class MilestonesFragment extends Fragment { private MilestonesViewModel milestonesViewModel; private FragmentMilestonesBinding viewBinding; - private Menu menu; private List dataList; private MilestonesAdapter adapter; private RepositoryContext repository; @@ -59,7 +60,6 @@ public class MilestonesFragment extends Fragment { @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { viewBinding = FragmentMilestonesBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); Context ctx = getContext(); milestonesViewModel = new ViewModelProvider(this).get(MilestonesViewModel.class); @@ -96,11 +96,6 @@ public class MilestonesFragment extends Fragment { .setFragmentRefreshListenerMilestone( milestoneState -> { state = milestoneState; - if (milestoneState.equals("open")) { - menu.getItem(1).setIcon(R.drawable.ic_filter); - } else { - menu.getItem(1).setIcon(R.drawable.ic_filter_closed); - } page = 1; dataList.clear(); @@ -119,6 +114,56 @@ public class MilestonesFragment extends Fragment { v13 -> startActivity(repository.getIntent(ctx, CreateMilestoneActivity.class))); fetchDataAsync(repository.getOwner(), repository.getName(), state); + + requireActivity() + .addMenuProvider( + new MenuProvider() { + + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + + menuInflater.inflate(R.menu.search_menu, menu); + menuInflater.inflate(R.menu.filter_menu_milestone, menu); + + if (repository.getMilestoneState().toString().equals("open")) { + menu.getItem(1).setIcon(R.drawable.ic_filter); + } else { + menu.getItem(1).setIcon(R.drawable.ic_filter_closed); + } + + 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) { + filter(newText); + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + return viewBinding.getRoot(); } @@ -195,37 +240,6 @@ public class MilestonesFragment extends Fragment { return -1; } - @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_milestone, 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) { - - filter(newText); - return false; - } - }); - } - private void filter(String text) { List arr = new ArrayList<>(); diff --git a/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java index 36b14ca1..601b64b2 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java @@ -12,7 +12,9 @@ import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; @@ -45,11 +47,8 @@ public class NotificationsFragment extends Fragment private final List notificationThreads = new ArrayList<>(); private FragmentNotificationsBinding viewBinding; private NotificationsAdapter notificationsAdapter; - private Activity activity; private Context context; - private Menu menu; - private int pageCurrentIndex = 1; private int pageResultLimit; private String currentFilterMode = "unread"; @@ -68,7 +67,6 @@ public class NotificationsFragment extends Fragment @Nullable Bundle savedInstanceState) { viewBinding = FragmentNotificationsBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); activity = requireActivity(); context = getContext(); @@ -133,37 +131,42 @@ public class NotificationsFragment extends Fragment loadNotifications(false); } else { - if (!emptyErrorResponse.isEmpty()) { - if (emptyErrorResponse.contains( - "205")) { + if (emptyErrorResponse != null) { + if (!emptyErrorResponse.isEmpty()) { + if (emptyErrorResponse.contains( + "205")) { - SnackBar.success( - context, - requireActivity() - .findViewById( - android.R.id - .content), - getString( - R.string - .markedNotificationsAsRead)); - pageCurrentIndex = 1; - loadNotifications(false); + SnackBar.success( + context, + requireActivity() + .findViewById( + android + .R + .id + .content), + getString( + R.string + .markedNotificationsAsRead)); + pageCurrentIndex = 1; + loadNotifications(false); + } + } else { + + activity.runOnUiThread( + () -> + SnackBar.error( + context, + requireActivity() + .findViewById( + android + .R + .id + .content), + getString( + R + .string + .genericError))); } - } else { - - activity.runOnUiThread( - () -> - SnackBar.error( - context, - requireActivity() - .findViewById( - android - .R - .id - .content), - getString( - R.string - .genericError))); } } })); @@ -176,6 +179,73 @@ public class NotificationsFragment extends Fragment }); loadNotifications(true); + + requireActivity() + .addMenuProvider( + new MenuProvider() { + + Menu menu; + + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + + this.menu = menu; + menuInflater.inflate(R.menu.filter_menu_notifications, menu); + + int filterIcon = + currentFilterMode.equalsIgnoreCase("read") + ? R.drawable.ic_filter_closed + : R.drawable.ic_filter; + + menu.getItem(0).setIcon(filterIcon); + + if (currentFilterMode.equalsIgnoreCase("read")) { + viewBinding.markAllAsRead.setVisibility(View.GONE); + } else { + viewBinding.markAllAsRead.setVisibility(View.VISIBLE); + } + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + + if (menu.getItem(0).getItemId() == R.id.filterNotifications) { + + BottomSheetNotificationsFilterFragment + bottomSheetNotificationsFilterFragment = + new BottomSheetNotificationsFilterFragment(); + bottomSheetNotificationsFilterFragment.show( + getChildFragmentManager(), + "notificationsFilterBottomSheet"); + bottomSheetNotificationsFilterFragment.setOnClickListener( + (text) -> { + currentFilterMode = text; + pageCurrentIndex = 1; + loadNotifications(false); + + int filterIcon = + currentFilterMode.equalsIgnoreCase("read") + ? R.drawable.ic_filter_closed + : R.drawable.ic_filter; + + menu.getItem(0).setIcon(filterIcon); + + if (currentFilterMode.equalsIgnoreCase("read")) { + viewBinding.markAllAsRead.setVisibility( + View.GONE); + } else { + viewBinding.markAllAsRead.setVisibility( + View.VISIBLE); + } + }); + } + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + return viewBinding.getRoot(); } @@ -216,9 +286,9 @@ public class NotificationsFragment extends Fragment } if (!append - || Objects.requireNonNull(listResponse.get().body()) - .size() - > 0) { + || !Objects.requireNonNull( + listResponse.get().body()) + .isEmpty()) { notificationsAdapter.notifyDataChanged(); } } @@ -241,53 +311,6 @@ public class NotificationsFragment extends Fragment }); } - private void changeFilterMode() { - - int filterIcon = - currentFilterMode.equalsIgnoreCase("read") - ? R.drawable.ic_filter_closed - : R.drawable.ic_filter; - - menu.getItem(0).setIcon(filterIcon); - - if (currentFilterMode.equalsIgnoreCase("read")) { - viewBinding.markAllAsRead.setVisibility(View.GONE); - } else { - viewBinding.markAllAsRead.setVisibility(View.VISIBLE); - } - } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - - this.menu = menu; - inflater.inflate(R.menu.filter_menu_notifications, menu); - changeFilterMode(); - - super.onCreateOptionsMenu(menu, inflater); - } - - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - - if (item.getItemId() == R.id.filterNotifications) { - - BottomSheetNotificationsFilterFragment bottomSheetNotificationsFilterFragment = - new BottomSheetNotificationsFilterFragment(); - bottomSheetNotificationsFilterFragment.show( - getChildFragmentManager(), "notificationsFilterBottomSheet"); - bottomSheetNotificationsFilterFragment.setOnClickListener( - (text) -> { - currentFilterMode = text; - changeFilterMode(); - pageCurrentIndex = 1; - loadNotifications(false); - }); - return true; - } - return super.onOptionsItemSelected(item); - } - @Override public void onNotificationClicked(NotificationThread notificationThread) { diff --git a/app/src/main/java/org/mian/gitnex/fragments/OrganizationLabelsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/OrganizationLabelsFragment.java index 43ec060e..9edd394e 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/OrganizationLabelsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/OrganizationLabelsFragment.java @@ -65,7 +65,6 @@ public class OrganizationLabelsFragment extends Fragment { FragmentLabelsBinding fragmentLabelsBinding = FragmentLabelsBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); organizationLabelsViewModel = new ViewModelProvider(this).get(OrganizationLabelsViewModel.class); diff --git a/app/src/main/java/org/mian/gitnex/fragments/OrganizationRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/OrganizationRepositoriesFragment.java index 338e250f..33c1ac6c 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/OrganizationRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/OrganizationRepositoriesFragment.java @@ -12,9 +12,12 @@ 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 java.util.Objects; import org.gitnex.tea4j.v2.models.OrganizationPermissions; import org.mian.gitnex.R; import org.mian.gitnex.activities.CreateRepoActivity; @@ -65,7 +68,6 @@ public class OrganizationRepositoriesFragment extends Fragment { fragmentRepositoriesBinding = FragmentRepositoriesBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); repositoriesViewModel = new ViewModelProvider(this).get(RepositoriesViewModel.class); resultLimit = Constants.getCurrentResultLimit(getContext()); @@ -102,10 +104,57 @@ public class OrganizationRepositoriesFragment extends Fragment { Intent intentRepo = new Intent(getContext(), CreateRepoActivity.class); intentRepo.putExtra("organizationAction", true); intentRepo.putExtra("orgName", orgName); - intentRepo.putExtras(requireActivity().getIntent().getExtras()); + intentRepo.putExtras( + Objects.requireNonNull(requireActivity().getIntent().getExtras())); startActivity(intentRepo); }); + 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); + return fragmentRepositoriesBinding.getRoot(); } @@ -176,32 +225,4 @@ public class OrganizationRepositoriesFragment extends Fragment { OrganizationDetailActivity.updateOrgFABActions = 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/OrganizationTeamInfoReposFragment.java b/app/src/main/java/org/mian/gitnex/fragments/OrganizationTeamInfoReposFragment.java index ecd64e65..66b4afe1 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/OrganizationTeamInfoReposFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/OrganizationTeamInfoReposFragment.java @@ -12,9 +12,12 @@ 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 java.util.Objects; import org.gitnex.tea4j.v2.models.OrganizationPermissions; import org.gitnex.tea4j.v2.models.Team; import org.mian.gitnex.R; @@ -58,7 +61,7 @@ public class OrganizationTeamInfoReposFragment extends Fragment { FragmentRepositoriesBinding.inflate(inflater, container, false); resultLimit = Constants.getCurrentResultLimit(getContext()); - setHasOptionsMenu(true); + team = (Team) requireArguments().getSerializable("team"); repositoriesViewModel = new ViewModelProvider(this).get(RepositoriesViewModel.class); @@ -89,7 +92,8 @@ public class OrganizationTeamInfoReposFragment extends Fragment { (OrganizationPermissions) requireActivity().getIntent().getSerializableExtra("permissions"); - if (!requireArguments().getBoolean("showRepo") || !permissions.isIsOwner()) { + if (!requireArguments().getBoolean("showRepo") + || !Objects.requireNonNull(permissions).isIsOwner()) { fragmentRepositoriesBinding.addNewRepo.setVisibility(View.GONE); } fragmentRepositoriesBinding.addNewRepo.setOnClickListener( @@ -102,6 +106,52 @@ public class OrganizationTeamInfoReposFragment extends Fragment { startActivity(intent); }); + 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); + return fragmentRepositoriesBinding.getRoot(); } @@ -170,33 +220,4 @@ public class OrganizationTeamInfoReposFragment 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/OrganizationTeamsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/OrganizationTeamsFragment.java index bcd313e4..af74fa41 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/OrganizationTeamsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/OrganizationTeamsFragment.java @@ -1,5 +1,6 @@ package org.mian.gitnex.fragments; +import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.os.Handler; @@ -14,11 +15,14 @@ import android.view.inputmethod.EditorInfo; import android.widget.ProgressBar; import android.widget.TextView; 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 androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import java.util.Objects; import org.gitnex.tea4j.v2.models.OrganizationPermissions; import org.mian.gitnex.R; import org.mian.gitnex.activities.CreateTeamByOrgActivity; @@ -69,7 +73,7 @@ public class OrganizationTeamsFragment extends Fragment { FragmentOrganizationTeamsBinding fragmentTeamsByOrgBinding = FragmentOrganizationTeamsBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); + teamsByOrgViewModel = new ViewModelProvider(this).get(TeamsByOrgViewModel.class); noDataTeams = fragmentTeamsByOrgBinding.noDataTeams; @@ -105,10 +109,55 @@ public class OrganizationTeamsFragment extends Fragment { fragmentTeamsByOrgBinding.createTeam.setOnClickListener( v1 -> { Intent intentTeam = new Intent(getContext(), CreateTeamByOrgActivity.class); - intentTeam.putExtras(requireActivity().getIntent().getExtras()); + intentTeam.putExtras( + Objects.requireNonNull(requireActivity().getIntent().getExtras())); startActivity(intentTeam); }); + 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 (mRecyclerView.getAdapter() != null) { + adapter.getFilter().filter(newText); + } + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + return fragmentTeamsByOrgBinding.getRoot(); } @@ -122,6 +171,7 @@ public class OrganizationTeamsFragment extends Fragment { } } + @SuppressLint("NotifyDataSetChanged") private void fetchDataAsync(String owner) { teamsByOrgViewModel @@ -143,32 +193,4 @@ public class OrganizationTeamsFragment extends Fragment { mProgressBar.setVisibility(View.GONE); }); } - - @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 (mRecyclerView.getAdapter() != null) { - adapter.getFilter().filter(newText); - } - return false; - } - }); - } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/PullRequestCommitsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/PullRequestCommitsFragment.java index b27fe95f..2d6d6659 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/PullRequestCommitsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/PullRequestCommitsFragment.java @@ -14,12 +14,13 @@ import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.RelativeLayout; 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; import org.gitnex.tea4j.v2.models.Commit; -import org.jetbrains.annotations.NotNull; import org.mian.gitnex.R; import org.mian.gitnex.adapters.CommitsAdapter; import org.mian.gitnex.clients.RetrofitClient; @@ -108,6 +109,48 @@ public class PullRequestCommitsFragment extends Fragment { loadInitial(issue, resultLimit); + 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) { + filter(newText); + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + return binding.getRoot(); } @@ -142,7 +185,7 @@ public class PullRequestCommitsFragment extends Fragment { if (response.code() == 200) { assert response.body() != null; - if (response.body().size() > 0) { + if (!response.body().isEmpty()) { commitsList.clear(); commitsList.addAll(response.body()); @@ -203,7 +246,7 @@ public class PullRequestCommitsFragment extends Fragment { List result = response.body(); assert result != null; - if (result.size() > 0) { + if (!result.isEmpty()) { pageSize = result.size(); commitsList.addAll(result); @@ -230,34 +273,6 @@ public class PullRequestCommitsFragment extends Fragment { }); } - @Override - public void onCreateOptionsMenu(@NotNull Menu menu, MenuInflater inflater) { - - inflater.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(); - 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) { - - filter(newText); - return true; - } - }); - } - private void filter(String text) { List arr = new ArrayList<>(); diff --git a/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java index 0afa73db..f576d2dd 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java @@ -14,7 +14,9 @@ import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import java.util.ArrayList; @@ -41,7 +43,6 @@ public class PullRequestsFragment extends Fragment { public static boolean resumePullRequests = false; private final String TAG = "PullRequestFragment"; private FragmentPullRequestsBinding fragmentPullRequestsBinding; - private Menu menu; private List prList; private PullRequestsAdapter adapter; private Context context; @@ -64,7 +65,6 @@ public class PullRequestsFragment extends Fragment { fragmentPullRequestsBinding = FragmentPullRequestsBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); context = getContext(); final SwipeRefreshLayout swipeRefresh = fragmentPullRequestsBinding.pullToRefresh; @@ -113,12 +113,6 @@ public class PullRequestsFragment extends Fragment { ((RepoDetailActivity) requireActivity()) .setFragmentRefreshListenerPr( prState -> { - if (prState.equals("closed")) { - menu.getItem(1).setIcon(R.drawable.ic_filter_closed); - } else { - menu.getItem(1).setIcon(R.drawable.ic_filter); - } - prList.clear(); adapter = new PullRequestsAdapter(context, prList); @@ -180,6 +174,55 @@ public class PullRequestsFragment extends Fragment { fragmentPullRequestsBinding.createPullRequest.setVisibility(View.GONE); } + requireActivity() + .addMenuProvider( + new MenuProvider() { + + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + + menuInflater.inflate(R.menu.search_menu, menu); + menuInflater.inflate(R.menu.filter_menu_pr, menu); + + if (repository.getPrState().toString().equals("closed")) { + menu.getItem(1).setIcon(R.drawable.ic_filter_closed); + } else { + menu.getItem(1).setIcon(R.drawable.ic_filter); + } + + 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) { + filter(newText); + return false; + } + }); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + return fragmentPullRequestsBinding.getRoot(); } @@ -226,7 +269,7 @@ public class PullRequestsFragment extends Fragment { if (response.code() == 200) { assert response.body() != null; - if (response.body().size() > 0) { + if (!response.body().isEmpty()) { prList.clear(); prList.addAll(response.body()); adapter.notifyDataChanged(); @@ -285,7 +328,7 @@ public class PullRequestsFragment extends Fragment { List result = response.body(); assert result != null; - if (result.size() > 0) { + if (!result.isEmpty()) { pageSize = result.size(); prList.addAll(result); } else { @@ -305,41 +348,6 @@ public class PullRequestsFragment extends Fragment { }); } - @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_pr, menu); - super.onCreateOptionsMenu(menu, inflater); - - if (repository.getPrState().toString().equals("closed")) { - menu.getItem(1).setIcon(R.drawable.ic_filter_closed); - } else { - menu.getItem(1).setIcon(R.drawable.ic_filter); - } - - 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) { - filter(newText); - return false; - } - }); - } - private void filter(String text) { List arr = new ArrayList<>(); diff --git a/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java index b4eb2dcc..325ef2a5 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java @@ -11,13 +11,16 @@ import android.os.Looper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.core.app.NotificationCompat; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import java.io.IOException; @@ -121,7 +124,6 @@ public class ReleasesFragment extends Fragment { fetchDataAsync(repository.getOwner(), repository.getName()); - setHasOptionsMenu(true); ((RepoDetailActivity) requireActivity()) .setFragmentRefreshListenerReleases( type -> { @@ -149,6 +151,25 @@ public class ReleasesFragment extends Fragment { startActivity( repository.getIntent(getContext(), CreateReleaseActivity.class))); + requireActivity() + .addMenuProvider( + new MenuProvider() { + + @Override + public void onCreateMenu( + @NonNull Menu menu, @NonNull MenuInflater menuInflater) { + + menuInflater.inflate(R.menu.filter_menu_releases, menu); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + return false; + } + }, + getViewLifecycleOwner(), + Lifecycle.State.RESUMED); + return fragmentReleasesBinding.getRoot(); } @@ -282,14 +303,14 @@ public class ReleasesFragment extends Fragment { return -1; } - @Override + /*@Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { if (!((BaseActivity) requireActivity()).getAccount().requiresVersion("1.15.0")) { return; } inflater.inflate(R.menu.filter_menu_releases, menu); super.onCreateOptionsMenu(menu, inflater); - } + }*/ private void requestFileDownload(String url) { currentDownloadUrl = url; @@ -400,8 +421,7 @@ public class ReleasesFragment extends Fragment { @NonNull Response response) throws IOException { - if (!response.isSuccessful() - || response.body() == null) { + if (!response.isSuccessful()) { onFailure(call, new IOException()); return; } @@ -410,8 +430,10 @@ public class ReleasesFragment extends Fragment { requireContext() .getContentResolver() .openOutputStream( - result.getData() - .getData()); + Objects + .requireNonNull( + result.getData() + .getData())); AppUtil.copyProgress( Objects.requireNonNull( diff --git a/app/src/main/java/org/mian/gitnex/fragments/WikiFragment.java b/app/src/main/java/org/mian/gitnex/fragments/WikiFragment.java index c86209a1..0aa76469 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/WikiFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/WikiFragment.java @@ -51,7 +51,6 @@ public class WikiFragment extends Fragment { @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { fragmentWikiBinding = FragmentWikiBinding.inflate(inflater, container, false); - setHasOptionsMenu(true); AccountContext account = ((BaseActivity) requireActivity()).getAccount(); boolean archived = repository.getRepository().isArchived(); diff --git a/app/src/main/res/layout/activity_commits.xml b/app/src/main/res/layout/activity_commits.xml index 80bfb937..8571e1ac 100644 --- a/app/src/main/res/layout/activity_commits.xml +++ b/app/src/main/res/layout/activity_commits.xml @@ -1,5 +1,5 @@ - - + diff --git a/app/src/main/res/menu/files_switch_branches_menu.xml b/app/src/main/res/menu/files_switch_branches_menu.xml index 5452a743..eda3c061 100644 --- a/app/src/main/res/menu/files_switch_branches_menu.xml +++ b/app/src/main/res/menu/files_switch_branches_menu.xml @@ -5,7 +5,7 @@