diff --git a/app/src/main/java/com/topjohnwu/magisk/adapters/ApplicationAdapter.java b/app/src/main/java/com/topjohnwu/magisk/adapters/ApplicationAdapter.java
index 78bbcc8a8..7b11c4e43 100644
--- a/app/src/main/java/com/topjohnwu/magisk/adapters/ApplicationAdapter.java
+++ b/app/src/main/java/com/topjohnwu/magisk/adapters/ApplicationAdapter.java
@@ -23,6 +23,8 @@ import com.buildware.widget.indeterm.IndeterminateCheckBox;
import com.topjohnwu.magisk.App;
import com.topjohnwu.magisk.Config;
import com.topjohnwu.magisk.R;
+import com.topjohnwu.magisk.uicomponents.ArrowExpandable;
+import com.topjohnwu.magisk.uicomponents.Expandable;
import com.topjohnwu.magisk.utils.Topic;
import com.topjohnwu.magisk.utils.Utils;
import com.topjohnwu.superuser.Shell;
@@ -110,30 +112,30 @@ public class ApplicationAdapter extends SectionedAdapter
holder.app_icon.setImageDrawable(app.info.loadIcon(pm));
holder.package_name.setText(app.info.packageName);
holder.checkBox.setOnStateChangedListener(null);
- holder.checkBox.setOnStateChangedListener(app.listener);
holder.checkBox.setState(app.getState());
- if (app.expanded) {
- holder.checkBox.setVisibility(View.GONE);
- getMargins(holder).bottomMargin = 0;
- } else {
- holder.checkBox.setVisibility(View.VISIBLE);
- getMargins(holder).bottomMargin = BOTTOM_MARGIN;
- }
- holder.itemView.setOnClickListener((v) -> {
- int index = getItemPosition(section, 0);
+ holder.ex.setExpanded(app.expanded);
+
+ int index = getItemPosition(section, 0);
+ holder.checkBox.setOnStateChangedListener((IndeterminateCheckBox box, @Nullable Boolean status) -> {
+ if (status != null) {
+ for (HideProcessInfo p : app.processList) {
+ String cmd = Utils.fmt("magiskhide --%s %s %s",
+ status ? "add" : "rm", app.info.packageName, p.name);
+ Shell.su(cmd).submit();
+ p.hidden = status;
+ }
+ notifyItemRangeChanged(index, app.processList.size());
+ }
+ });
+ holder.trigger.setOnClickListener((v) -> {
if (app.expanded) {
app.expanded = false;
notifyItemRangeRemoved(index, app.processList.size());
- getMargins(holder).bottomMargin = BOTTOM_MARGIN;
- holder.checkBox.setOnStateChangedListener(null);
- holder.checkBox.setVisibility(View.VISIBLE);
- holder.checkBox.setState(app.getState());
- holder.checkBox.setOnStateChangedListener(app.listener);
+ holder.ex.collapse();
} else {
- holder.checkBox.setVisibility(View.GONE);
- getMargins(holder).bottomMargin = 0;
app.expanded = true;
notifyItemRangeInserted(index, app.processList.size());
+ holder.ex.expand();
}
});
}
@@ -149,6 +151,7 @@ public class ApplicationAdapter extends SectionedAdapter
Shell.su(Utils.fmt("magiskhide --%s %s %s", checked ? "add" : "rm",
hideApp.info.packageName, target.name)).submit();
target.hidden = checked;
+ notifyItemChanged(getSectionPosition(section));
});
getMargins(holder).bottomMargin =
position == hideApp.processList.size() - 1 ? BOTTOM_MARGIN : 0;
@@ -350,10 +353,25 @@ public class ApplicationAdapter extends SectionedAdapter
@BindView(R.id.app_name) TextView app_name;
@BindView(R.id.package_name) TextView package_name;
@BindView(R.id.checkbox) IndeterminateCheckBox checkBox;
+ @BindView(R.id.trigger) View trigger;
+ @BindView(R.id.arrow) ImageView arrow;
+
+ Expandable ex;
AppViewHolder(@NonNull View itemView) {
super(itemView);
new ApplicationAdapter$AppViewHolder_ViewBinding(this, itemView);
+ ex = new ArrowExpandable(new Expandable() {
+ @Override
+ protected void onExpand() {
+ getMargins(AppViewHolder.this).bottomMargin = 0;
+ }
+
+ @Override
+ protected void onCollapse() {
+ getMargins(AppViewHolder.this).bottomMargin = BOTTOM_MARGIN;
+ }
+ }, arrow);
}
}
diff --git a/app/src/main/res/layout/list_item_hide_app.xml b/app/src/main/res/layout/list_item_hide_app.xml
index 7180fc7f3..6bf54d091 100644
--- a/app/src/main/res/layout/list_item_hide_app.xml
+++ b/app/src/main/res/layout/list_item_hide_app.xml
@@ -1,7 +1,6 @@
-
+
+
+
+
+ app:layout_constraintTop_toTopOf="parent" />