From 81e2b5cfb761d6d229fe16397c4b18f186d2c3a9 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Wed, 6 Apr 2022 22:54:45 +0800 Subject: [PATCH] Make swtichbar an item of rv (#1817) --- .../manager/adapters/ScopeAdapter.java | 42 +++++++++++++---- .../manager/ui/fragment/AppListFragment.java | 6 ++- .../ui/widget/EmptyStateRecyclerView.java | 9 ++++ app/src/main/res/layout/fragment_app_list.xml | 46 +++++++------------ .../main/res/layout/item_master_switch.xml | 6 +++ 5 files changed, 71 insertions(+), 38 deletions(-) create mode 100644 app/src/main/res/layout/item_master_switch.xml diff --git a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java index bf14c4db..949aabf6 100644 --- a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java @@ -67,6 +67,7 @@ import org.lsposed.manager.App; import org.lsposed.manager.BuildConfig; import org.lsposed.manager.ConfigManager; import org.lsposed.manager.R; +import org.lsposed.manager.databinding.ItemMasterSwitchBinding; import org.lsposed.manager.databinding.ItemModuleBinding; import org.lsposed.manager.ui.dialog.BlurBehindDialogBuilder; import org.lsposed.manager.ui.fragment.AppListFragment; @@ -86,6 +87,7 @@ import java.util.stream.Collectors; import rikka.core.util.ResourceUtils; import rikka.material.app.LocaleDelegate; +import rikka.widget.mainswitchbar.MainSwitchBar; import rikka.widget.mainswitchbar.OnMainSwitchChangeListener; @SuppressLint("NotifyDataSetChanged") @@ -105,18 +107,43 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter showList = new ArrayList<>(); private List denyList = new ArrayList<>(); + public RecyclerView.Adapter switchAdaptor = new RecyclerView.Adapter<>() { + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new RecyclerView.ViewHolder(ItemMasterSwitchBinding.inflate(activity.getLayoutInflater(), parent, false).masterSwitch) { + }; + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + var mainSwitchBar = (MainSwitchBar) holder.itemView; + mainSwitchBar.setChecked(enabled); + mainSwitchBar.addOnSwitchChangeListener(switchBarOnCheckedChangeListener); + // bug of MainSwitchBar, force set the checkedChangeListener + fragment.runOnUiThread(mainSwitchBar::show); + } + + @Override + public int getItemCount() { + return 1; + } + }; + private final OnMainSwitchChangeListener switchBarOnCheckedChangeListener = new OnMainSwitchChangeListener() { @Override public void onSwitchChanged(Switch view, boolean isChecked) { + enabled = isChecked; if (!moduleUtil.setModuleEnabled(module.packageName, isChecked)) { view.setChecked(!isChecked); + enabled = !isChecked; } var tmpChkList = new HashSet<>(checkedList); if (isChecked && !tmpChkList.isEmpty() && !ConfigManager.setModuleScope(module.packageName, tmpChkList)) { view.setChecked(false); + enabled = false; } - enabled = isChecked; - notifyDataSetChanged(); + fragment.runOnUiThread(ScopeAdapter.this::notifyDataSetChanged); } }; @@ -205,7 +232,7 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter { List appList = AppHelper.getAppList(force); denyList = AppHelper.getDenyList(force); @@ -640,7 +666,7 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter binding.appBar.setLifted(!top)); diff --git a/app/src/main/java/org/lsposed/manager/ui/widget/EmptyStateRecyclerView.java b/app/src/main/java/org/lsposed/manager/ui/widget/EmptyStateRecyclerView.java index 5f1d89f5..02a6cd69 100644 --- a/app/src/main/java/org/lsposed/manager/ui/widget/EmptyStateRecyclerView.java +++ b/app/src/main/java/org/lsposed/manager/ui/widget/EmptyStateRecyclerView.java @@ -29,6 +29,7 @@ import android.util.AttributeSet; import android.util.DisplayMetrics; import androidx.annotation.Nullable; +import androidx.recyclerview.widget.ConcatAdapter; import org.lsposed.manager.R; import org.lsposed.manager.util.SimpleStatefulAdaptor; @@ -61,6 +62,14 @@ public class EmptyStateRecyclerView extends StatefulRecyclerView { protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); var adapter = getAdapter(); + if (adapter instanceof ConcatAdapter) { + for (var a : ((ConcatAdapter) adapter).getAdapters()) { + if (a instanceof EmptyStateAdapter) { + adapter = a; + break; + } + } + } if (adapter instanceof EmptyStateAdapter && ((EmptyStateAdapter) adapter).isLoaded() && adapter.getItemCount() == 0) { final int width = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); final int height = getMeasuredHeight() - getPaddingTop() - getPaddingBottom(); diff --git a/app/src/main/res/layout/fragment_app_list.xml b/app/src/main/res/layout/fragment_app_list.xml index f81093ce..0600e235 100644 --- a/app/src/main/res/layout/fragment_app_list.xml +++ b/app/src/main/res/layout/fragment_app_list.xml @@ -74,41 +74,29 @@ app:layout_fitsSystemWindowsInsets="@integer/internal_fragment_bottom_insets" app:tint="?attr/colorOnPrimary" /> - - - - - - - - - - + android:layout_height="wrap_content" + android:clipToPadding="false" + android:fadeScrollbars="true" + android:scrollbarStyle="insideOverlay" + android:scrollbars="vertical" + app:borderBottomVisibility="never" + app:borderTopDrawable="@null" + app:borderTopVisibility="whenTop" + app:fitsSystemWindowsInsets="@integer/internal_fragment_bottom_insets" /> + + diff --git a/app/src/main/res/layout/item_master_switch.xml b/app/src/main/res/layout/item_master_switch.xml new file mode 100644 index 00000000..4295067f --- /dev/null +++ b/app/src/main/res/layout/item_master_switch.xml @@ -0,0 +1,6 @@ + +