From 9946708dbe89f7f88bff65399bd6b5653ada932c Mon Sep 17 00:00:00 2001 From: tehcneko <7764726+tehcneko@users.noreply.github.com> Date: Thu, 3 Jun 2021 03:27:41 +0800 Subject: [PATCH] [app] Fix module list (#722) --- .../manager/ui/fragment/ModulesFragment.java | 145 ++++++++++-------- app/src/main/res/layout/fragment_logs.xml | 3 + 2 files changed, 85 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java index 011a68ea..0ca215e9 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java @@ -55,8 +55,11 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.SearchView; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.Lifecycle; import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager2.adapter.FragmentStateAdapter; import androidx.viewpager2.widget.ViewPager2; import com.bumptech.glide.request.target.CustomTarget; @@ -101,8 +104,8 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi protected FragmentPagerBinding binding; protected SearchView searchView; private SearchView.OnQueryTextListener searchListener; - private final PagerAdapter pagerAdapter = new PagerAdapter(); private final ArrayList adapters = new ArrayList<>(); + private final ArrayList tabTitles = new ArrayList<>(); private ModuleUtil.InstalledModule selectedModule; @@ -138,7 +141,7 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi binding.getRoot().bringChildToFront(binding.appBar); setupToolbar(binding.toolbar, R.string.Modules, R.menu.menu_modules); - binding.viewPager.setAdapter(pagerAdapter); + binding.viewPager.setAdapter(new PagerAdapter(requireActivity())); binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { @@ -147,11 +150,42 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi if (recyclerView != null) { binding.appBar.setRaised(!recyclerView.getBorderViewDelegate().isShowingTopBorder()); } - if (position > 0) binding.fab.show(); - else binding.fab.hide(); + + if (position > 0) { + binding.fab.show(); + } else { + binding.fab.hide(); + } } }); + var users = ConfigManager.getUsers(); + if (users != null) { + adapters.clear(); + if (users.size() != 1) { + tabTitles.clear(); + for (var user : users) { + var adapter = new ModuleAdapter(user); + adapter.setHasStableIds(true); + adapters.add(adapter); + tabTitles.add(user.name); + } + new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> { + if (position < tabTitles.size()) { + tab.setText(tabTitles.get(position)); + } + }).attach(); + binding.viewPager.setUserInputEnabled(true); + binding.tabLayout.setVisibility(View.VISIBLE); + } else { + var adapter = new ModuleAdapter(null); + adapter.setHasStableIds(true); + adapters.add(adapter); + binding.viewPager.setUserInputEnabled(false); + binding.tabLayout.setVisibility(View.GONE); + } + } + binding.fab.setOnClickListener(v -> { var pickAdaptor = new ModuleAdapter(null, true); var position = binding.viewPager.getCurrentItem(); @@ -195,31 +229,6 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi @Override public void onResume() { super.onResume(); - var users = ConfigManager.getUsers(); - if (users != null) { - if (users.size() != adapters.size()) { - adapters.clear(); - if (users.size() != 1) { - ArrayList titles = new ArrayList<>(); - for (var user : users) { - var adapter = new ModuleAdapter(user); - adapter.setHasStableIds(true); - adapters.add(adapter); - titles.add(user.name); - } - binding.viewPager.setUserInputEnabled(true); - new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> tab.setText(titles.get(position))).attach(); - binding.tabLayout.setVisibility(View.VISIBLE); - } else { - var adapter = new ModuleAdapter(null); - adapter.setHasStableIds(true); - adapters.add(adapter); - binding.viewPager.setUserInputEnabled(false); - binding.tabLayout.setVisibility(View.GONE); - } - pagerAdapter.notifyDataSetChanged(); - } - } adapters.forEach(ModuleAdapter::refresh); } @@ -327,49 +336,59 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi binding = null; } - private class PagerAdapter extends RecyclerView.Adapter { + public static class ModuleListFragment extends Fragment { + private final int position; + private final ModulesFragment fragment; + + public ModuleListFragment(int position, ModulesFragment fragment) { + this.position = position; + this.fragment = fragment; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + ItemRepoRecyclerviewBinding binding = ItemRepoRecyclerviewBinding.inflate(getLayoutInflater(), container, false); + if (fragment.adapters.size() == 1) { + WindowInsetsHelperKt.setInitialPadding(binding.recyclerView, 0, ResourcesKt.resolveDimensionPixelOffset(requireActivity().getTheme(), R.attr.actionBarSize, 0), 0, 0); + } + binding.recyclerView.setTag(position); + binding.recyclerView.setAdapter(fragment.adapters.get(position)); + RecyclerView.LayoutManager layoutManager = new LinearLayoutManagerFix(requireActivity()); + binding.recyclerView.setLayoutManager(layoutManager); + binding.recyclerView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> fragment.binding.appBar.setRaised(!top)); + binding.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + if (newState == RecyclerView.SCROLL_STATE_IDLE && position > 0) { + fragment.binding.fab.show(); + } else { + fragment.binding.fab.hide(); + } + } + }); + RecyclerViewKt.fixEdgeEffect(binding.recyclerView, false, true); + RecyclerViewKt.addFastScroller(binding.recyclerView, binding.recyclerView); + return binding.getRoot(); + } + } + + private class PagerAdapter extends FragmentStateAdapter { + + public PagerAdapter(@NonNull FragmentActivity fragmentActivity) { + super(fragmentActivity); + } @NonNull @Override - public PagerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new PagerAdapter.ViewHolder(ItemRepoRecyclerviewBinding.inflate(getLayoutInflater(), parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull PagerAdapter.ViewHolder holder, int position) { - if (getItemCount() == 1) { - WindowInsetsHelperKt.setInitialPadding(holder.recyclerView, 0, ResourcesKt.resolveDimensionPixelOffset(requireActivity().getTheme(), R.attr.actionBarSize, 0), 0, 0); - } - holder.recyclerView.setTag(position); - holder.recyclerView.setAdapter(adapters.get(position)); - holder.recyclerView.setLayoutManager(new LinearLayoutManagerFix(requireActivity())); - holder.recyclerView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> binding.appBar.setRaised(!top)); - holder.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { - if (newState == RecyclerView.SCROLL_STATE_IDLE && holder.getBindingAdapterPosition() > 0) - binding.fab.show(); - else binding.fab.hide(); - super.onScrollStateChanged(recyclerView, newState); - } - }); - RecyclerViewKt.fixEdgeEffect(holder.recyclerView, false, true); - RecyclerViewKt.addFastScroller(holder.recyclerView, holder.itemView); + public Fragment createFragment(int position) { + return new ModuleListFragment(position, ModulesFragment.this); } @Override public int getItemCount() { return adapters.size(); } - - class ViewHolder extends RecyclerView.ViewHolder { - BorderRecyclerView recyclerView; - - public ViewHolder(@NonNull ItemRepoRecyclerviewBinding binding) { - super(binding.getRoot()); - recyclerView = binding.recyclerView; - } - } } private class ModuleAdapter extends EmptyStateRecyclerView.EmptyStateAdapter implements Filterable { diff --git a/app/src/main/res/layout/fragment_logs.xml b/app/src/main/res/layout/fragment_logs.xml index aa5f3272..6322c6c4 100644 --- a/app/src/main/res/layout/fragment_logs.xml +++ b/app/src/main/res/layout/fragment_logs.xml @@ -80,7 +80,10 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:clipToPadding="false" + android:fadeScrollbars="true" android:paddingTop="104dp" + android:scrollbarStyle="outsideOverlay" + android:scrollbars="vertical" app:borderTopVisibility="whenTop" app:borderTopDrawable="@null" app:borderBottomVisibility="never"