diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 54d34093..b19adc3a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,9 +23,6 @@
package="org.lsposed.manager">
-
= Build.VERSION_CODES.Q
- && requireActivity().checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) == PackageManager.PERMISSION_GRANTED) {
- prefGroupSystem.setVisible(true);
- prefShowHiddenIcons.setVisible(true);
+ if (prefShowHiddenIcons != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ if (ConfigManager.isBinderAlive()) {
+ prefShowHiddenIcons.setEnabled(true);
+ prefShowHiddenIcons.setOnPreferenceChangeListener((preference, newValue) ->
+ ConfigManager.setHiddenIcon(!(boolean) newValue));
+ }
prefShowHiddenIcons.setChecked(Settings.Global.getInt(
requireActivity().getContentResolver(), "show_hidden_icon_apps_enabled", 1) != 0);
- prefShowHiddenIcons.setOnPreferenceChangeListener((preference, newValue) -> Settings.Global.putInt(requireActivity().getContentResolver(),
- "show_hidden_icon_apps_enabled", (boolean) newValue ? 1 : 0));
}
SwitchPreference prefFollowSystemAccent = findPreference("follow_system_accent");
diff --git a/app/src/main/res/xml/prefs.xml b/app/src/main/res/xml/prefs.xml
index 1c02359a..729cedfd 100644
--- a/app/src/main/res/xml/prefs.xml
+++ b/app/src/main/res/xml/prefs.xml
@@ -24,10 +24,10 @@
+ android:title="@string/dns_over_http" />
@@ -39,45 +39,45 @@
+ android:title="@string/theme_color" />
+ android:title="@string/dark_theme" />
+ android:summary="@string/pure_black_dark_theme_summary"
+ android:title="@string/pure_black_dark_theme" />
+ android:summary="@string/settings_enable_resources_summary"
+ android:title="@string/settings_enable_resources" />
+ android:persistent="false"
+ android:title="@string/pref_title_disable_verbose_log" />
+ android:title="@string/settings_backup_and_restore">
@@ -88,14 +88,13 @@
+ android:title="@string/settings_group_system">
+ android:summary="@string/settings_show_hidden_icon_apps_enabled_summary"
+ android:title="@string/settings_show_hidden_icon_apps_enabled" />
diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java b/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java
index b4407d7f..a6392ed5 100644
--- a/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java
+++ b/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java
@@ -32,6 +32,7 @@ import android.content.pm.VersionedPackage;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
+import android.os.ResultReceiver;
import android.os.SystemProperties;
import android.util.Log;
@@ -265,4 +266,17 @@ public class LSPManagerService extends ILSPManagerService.Stub {
public boolean dex2oatFlagsLoaded() {
return SystemProperties.get(PROP_NAME).contains(PROP_VALUE);
}
+
+ @Override
+ public void setHiddenIcon(boolean hide) {
+ var settings = new ServiceShellCommand("settings");
+ var enable = hide ? "0" : "1";
+ var args = new String[]{"put", "global", "show_hidden_icon_apps_enabled", enable};
+ try {
+ settings.shellCommand(FileDescriptor.in, FileDescriptor.out, FileDescriptor.err,
+ args, new ResultReceiver(null));
+ } catch (RemoteException e) {
+ Log.w(TAG, "setHiddenIcon: ", e);
+ }
+ }
}
diff --git a/core/src/main/java/org/lsposed/lspd/service/ServiceShellCommand.java b/core/src/main/java/org/lsposed/lspd/service/ServiceShellCommand.java
new file mode 100644
index 00000000..d85b5e84
--- /dev/null
+++ b/core/src/main/java/org/lsposed/lspd/service/ServiceShellCommand.java
@@ -0,0 +1,36 @@
+package org.lsposed.lspd.service;
+
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+
+import java.io.FileDescriptor;
+
+class ServiceShellCommand {
+ private static final int SHELL_COMMAND_TRANSACTION = ('_' << 24) | ('C' << 16) | ('M' << 8) | 'D';
+ private final IBinder binder;
+
+ ServiceShellCommand(String name) {
+ binder = android.os.ServiceManager.getService(name);
+ }
+
+ void shellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
+ String[] args, ResultReceiver resultReceiver) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeFileDescriptor(in);
+ data.writeFileDescriptor(out);
+ data.writeFileDescriptor(err);
+ data.writeStringArray(args);
+ data.writeStrongBinder(null);
+ resultReceiver.writeToParcel(data, 0);
+ try {
+ binder.transact(SHELL_COMMAND_TRANSACTION, data, reply, 0);
+ reply.readException();
+ } finally {
+ data.recycle();
+ reply.recycle();
+ }
+ }
+}
diff --git a/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl b/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl
index adcd0ac8..3730fb57 100644
--- a/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl
+++ b/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl
@@ -59,4 +59,6 @@ interface ILSPManagerService {
ParceledListSlice queryIntentActivitiesAsUser(in Intent intent, int flags, int userId) = 31;
boolean dex2oatFlagsLoaded() = 32;
+
+ void setHiddenIcon(boolean hide) = 33;
}