Use MenuProvider (#2436)

This commit is contained in:
LoveSy 2023-03-11 01:30:18 +08:00 committed by GitHub
parent af1223e4a5
commit 880dc4d719
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 83 additions and 31 deletions

View File

@ -23,6 +23,7 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -33,6 +34,7 @@ import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.core.view.MenuProvider;
import androidx.recyclerview.widget.ConcatAdapter; import androidx.recyclerview.widget.ConcatAdapter;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -49,7 +51,7 @@ import org.lsposed.manager.util.ModuleUtil;
import rikka.material.app.LocaleDelegate; import rikka.material.app.LocaleDelegate;
import rikka.recyclerview.RecyclerViewKt; import rikka.recyclerview.RecyclerViewKt;
public class AppListFragment extends BaseFragment { public class AppListFragment extends BaseFragment implements MenuProvider {
public SearchView searchView; public SearchView searchView;
private ScopeAdapter scopeAdapter; private ScopeAdapter scopeAdapter;
@ -191,16 +193,12 @@ public class AppListFragment extends BaseFragment {
} }
@Override @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onMenuItemSelected(@NonNull MenuItem item) {
if (scopeAdapter.onOptionsItemSelected(item)) { return scopeAdapter.onOptionsItemSelected(item);
return true;
}
return super.onOptionsItemSelected(item);
} }
@Override @Override
public void onPrepareOptionsMenu(@NonNull Menu menu) { public void onPrepareMenu(@NonNull Menu menu) {
super.onPrepareOptionsMenu(menu);
searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setOnQueryTextListener(searchListener); searchView.setOnQueryTextListener(searchListener);
searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@ -219,6 +217,11 @@ public class AppListFragment extends BaseFragment {
scopeAdapter.onPrepareOptionsMenu(menu); scopeAdapter.onPrepareOptionsMenu(menu);
} }
@Override
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
}
@Override @Override
public boolean onContextItemSelected(@NonNull MenuItem item) { public boolean onContextItemSelected(@NonNull MenuItem item) {
if (scopeAdapter.onContextItemSelected(item)) { if (scopeAdapter.onContextItemSelected(item)) {

View File

@ -27,6 +27,7 @@ import android.widget.Toast;
import androidx.annotation.IdRes; import androidx.annotation.IdRes;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.core.view.MenuProvider;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.navigation.NavController; import androidx.navigation.NavController;
import androidx.navigation.NavDirections; import androidx.navigation.NavDirections;
@ -43,7 +44,7 @@ import java.util.concurrent.Callable;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.FutureTask; import java.util.concurrent.FutureTask;
public class BaseFragment extends Fragment { public abstract class BaseFragment extends Fragment {
private final Handler uiHandler = new Handler(Looper.getMainLooper()); private final Handler uiHandler = new Handler(Looper.getMainLooper());
public void navigateUp() { public void navigateUp() {
@ -92,8 +93,11 @@ public class BaseFragment extends Fragment {
if (tipsView != null) tipsView.setTooltipText(title); if (tipsView != null) tipsView.setTooltipText(title);
if (menu != -1) { if (menu != -1) {
toolbar.inflateMenu(menu); toolbar.inflateMenu(menu);
toolbar.setOnMenuItemClickListener(this::onOptionsItemSelected); if (this instanceof MenuProvider) {
onPrepareOptionsMenu(toolbar.getMenu()); var self = (MenuProvider) this;
toolbar.setOnMenuItemClickListener(self::onMenuItemSelected);
self.onPrepareMenu(toolbar.getMenu());
}
} }
} }
@ -149,5 +153,4 @@ public class BaseFragment extends Fragment {
} }
}); });
} }
} }

View File

@ -26,12 +26,15 @@ import android.os.Bundle;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.text.HtmlCompat; import androidx.core.text.HtmlCompat;
import androidx.core.view.MenuProvider;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import org.lsposed.lspd.ILSPManagerService; import org.lsposed.lspd.ILSPManagerService;
@ -54,8 +57,7 @@ import java.util.HashMap;
import rikka.core.util.ClipboardUtils; import rikka.core.util.ClipboardUtils;
import rikka.material.app.LocaleDelegate; import rikka.material.app.LocaleDelegate;
public class HomeFragment extends BaseFragment { public class HomeFragment extends BaseFragment implements MenuProvider {
private FragmentHomeBinding binding; private FragmentHomeBinding binding;
@Override @Override
@ -65,7 +67,7 @@ public class HomeFragment extends BaseFragment {
} }
@Override @Override
public void onPrepareOptionsMenu(Menu menu) { public void onPrepareMenu(Menu menu) {
menu.findItem(R.id.menu_about).setOnMenuItemClickListener(v -> { menu.findItem(R.id.menu_about).setOnMenuItemClickListener(v -> {
showAbout(); showAbout();
return true; return true;
@ -76,6 +78,16 @@ public class HomeFragment extends BaseFragment {
}); });
} }
@Override
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
}
@Override
public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
return false;
}
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentHomeBinding.inflate(inflater, container, false); binding = FragmentHomeBinding.inflate(inflater, container, false);

View File

@ -27,6 +27,7 @@ import android.os.Looper;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -36,6 +37,7 @@ import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts; import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.view.MenuProvider;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -67,7 +69,7 @@ import java.util.stream.IntStream;
import rikka.material.app.LocaleDelegate; import rikka.material.app.LocaleDelegate;
import rikka.recyclerview.RecyclerViewKt; import rikka.recyclerview.RecyclerViewKt;
public class LogsFragment extends BaseFragment { public class LogsFragment extends BaseFragment implements MenuProvider {
private final Handler handler = new Handler(Looper.getMainLooper()); private final Handler handler = new Handler(Looper.getMainLooper());
private FragmentPagerBinding binding; private FragmentPagerBinding binding;
private LogPageAdapter adapter; private LogPageAdapter adapter;
@ -129,7 +131,7 @@ public class LogsFragment extends BaseFragment {
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
@Override @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onMenuItemSelected(@NonNull MenuItem item) {
var itemId = item.getItemId(); var itemId = item.getItemId();
if (itemId == R.id.menu_save) { if (itemId == R.id.menu_save) {
save(); save();
@ -142,20 +144,23 @@ public class LogsFragment extends BaseFragment {
return true; return true;
} }
if (optionsItemSelectListener != null) { if (optionsItemSelectListener != null) {
if (optionsItemSelectListener.onOptionsItemSelected(item)) return optionsItemSelectListener.onOptionsItemSelected(item);
return true;
} }
return super.onOptionsItemSelected(item); return false;
} }
@Override @Override
public void onPrepareOptionsMenu(@NonNull Menu menu) { public void onPrepareMenu(@NonNull Menu menu) {
super.onPrepareOptionsMenu(menu);
wordWrap = menu.findItem(R.id.menu_word_wrap); wordWrap = menu.findItem(R.id.menu_word_wrap);
wordWrap.setChecked(App.getPreferences().getBoolean("enable_word_wrap", false)); wordWrap.setChecked(App.getPreferences().getBoolean("enable_word_wrap", false));
binding.viewPager.setUserInputEnabled(wordWrap.isChecked()); binding.viewPager.setUserInputEnabled(wordWrap.isChecked());
} }
@Override
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
}
@Override @Override
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();

View File

@ -39,6 +39,7 @@ import android.text.style.TypefaceSpan;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -52,6 +53,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.view.MenuProvider;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.navigation.NavOptions; import androidx.navigation.NavOptions;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
@ -92,7 +94,7 @@ import rikka.core.util.ResourceUtils;
import rikka.material.app.LocaleDelegate; import rikka.material.app.LocaleDelegate;
import rikka.recyclerview.RecyclerViewKt; import rikka.recyclerview.RecyclerViewKt;
public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleListener, RepoLoader.RepoListener { public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleListener, RepoLoader.RepoListener, MenuProvider {
private static final PackageManager pm = App.getInstance().getPackageManager(); private static final PackageManager pm = App.getInstance().getPackageManager();
private static final ModuleUtil moduleUtil = ModuleUtil.getInstance(); private static final ModuleUtil moduleUtil = ModuleUtil.getInstance();
private static final RepoLoader repoLoader = RepoLoader.getInstance(); private static final RepoLoader repoLoader = RepoLoader.getInstance();
@ -190,7 +192,7 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi
} }
@Override @Override
public void onPrepareOptionsMenu(Menu menu) { public void onPrepareMenu(Menu menu) {
searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setOnQueryTextListener(searchListener); searchView.setOnQueryTextListener(searchListener);
searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@ -206,6 +208,16 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi
searchView.findViewById(androidx.appcompat.R.id.search_edit_frame).setLayoutDirection(View.LAYOUT_DIRECTION_INHERIT); searchView.findViewById(androidx.appcompat.R.id.search_edit_frame).setLayoutDirection(View.LAYOUT_DIRECTION_INHERIT);
} }
@Override
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
}
@Override
public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
return false;
}
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();

View File

@ -34,6 +34,7 @@ import android.text.style.StyleSpan;
import android.text.style.TypefaceSpan; import android.text.style.TypefaceSpan;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -46,6 +47,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.view.MenuProvider;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -74,7 +76,7 @@ import rikka.core.util.LabelComparator;
import rikka.core.util.ResourceUtils; import rikka.core.util.ResourceUtils;
import rikka.recyclerview.RecyclerViewKt; import rikka.recyclerview.RecyclerViewKt;
public class RepoFragment extends BaseFragment implements RepoLoader.RepoListener, ModuleUtil.ModuleListener { public class RepoFragment extends BaseFragment implements RepoLoader.RepoListener, ModuleUtil.ModuleListener, MenuProvider {
protected FragmentRepoBinding binding; protected FragmentRepoBinding binding;
protected SearchView searchView; protected SearchView searchView;
private SearchView.OnQueryTextListener mSearchListener; private SearchView.OnQueryTextListener mSearchListener;
@ -173,7 +175,7 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene
} }
@Override @Override
public void onPrepareOptionsMenu(Menu menu) { public void onPrepareMenu(Menu menu) {
searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setOnQueryTextListener(mSearchListener); searchView.setOnQueryTextListener(mSearchListener);
searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@ -198,6 +200,10 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene
menu.findItem(R.id.item_upgradable_first).setChecked(App.getPreferences().getBoolean("upgradable_first", true)); menu.findItem(R.id.item_upgradable_first).setChecked(App.getPreferences().getBoolean("upgradable_first", true));
} }
@Override
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
}
@Override @Override
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();
@ -239,7 +245,7 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene
} }
@Override @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onMenuItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId(); int itemId = item.getItemId();
if (itemId == R.id.item_sort_by_name) { if (itemId == R.id.item_sort_by_name) {
item.setChecked(true); item.setChecked(true);
@ -253,8 +259,10 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene
item.setChecked(!item.isChecked()); item.setChecked(!item.isChecked());
App.getPreferences().edit().putBoolean("upgradable_first", item.isChecked()).apply(); App.getPreferences().edit().putBoolean("upgradable_first", item.isChecked()).apply();
adapter.refresh(); adapter.refresh();
} else {
return false;
} }
return super.onOptionsItemSelected(item); return true;
} }
private class RepoAdapter extends EmptyStateRecyclerView.EmptyStateAdapter<RepoAdapter.ViewHolder> implements Filterable { private class RepoAdapter extends EmptyStateRecyclerView.EmptyStateAdapter<RepoAdapter.ViewHolder> implements Filterable {

View File

@ -34,6 +34,8 @@ import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan; import android.text.style.RelativeSizeSpan;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -48,6 +50,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.view.MenuProvider;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
@ -100,7 +103,7 @@ import rikka.material.app.LocaleDelegate;
import rikka.recyclerview.RecyclerViewKt; import rikka.recyclerview.RecyclerViewKt;
import rikka.widget.borderview.BorderView; import rikka.widget.borderview.BorderView;
public class RepoItemFragment extends BaseFragment implements RepoLoader.RepoListener { public class RepoItemFragment extends BaseFragment implements RepoLoader.RepoListener, MenuProvider {
FragmentPagerBinding binding; FragmentPagerBinding binding;
OnlineModule module; OnlineModule module;
private ReleaseAdapter releaseAdapter; private ReleaseAdapter releaseAdapter;
@ -222,12 +225,18 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.RepoLis
} }
@Override @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
}
@Override
public boolean onMenuItemSelected(@NonNull MenuItem item) {
int id = item.getItemId(); int id = item.getItemId();
if (id == R.id.menu_open_in_browser) { if (id == R.id.menu_open_in_browser) {
NavUtil.startURL(requireActivity(), "https://modules.lsposed.org/module/" + module.getName()); NavUtil.startURL(requireActivity(), "https://modules.lsposed.org/module/" + module.getName());
return true;
} }
return super.onOptionsItemSelected(item); return false;
} }
@Override @Override