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; }