[app] Added option to disable forced display of the application launcher icon on Android 10+ (#541)

* [core] Grant android.permission.WRITE_SECURE_SETTINGS

* Disable jetifier

* [app] Added option to disable forced display of the application launcher icon on Android 10+
This commit is contained in:
tehcneko 2021-05-06 20:27:38 +08:00 committed by GitHub
parent 0e66782101
commit 7139c3f11f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 48 additions and 16 deletions

View File

@ -26,6 +26,8 @@
<uses-permission <uses-permission
android:name="android.permission.INTERACT_ACROSS_USERS" android:name="android.permission.INTERACT_ACROSS_USERS"
tools:ignore="ProtectedPermissions" /> tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<queries> <queries>
<intent> <intent>

View File

@ -21,7 +21,6 @@
package org.lsposed.manager.ui.activity; package org.lsposed.manager.ui.activity;
import android.content.Intent; import android.content.Intent;
import android.content.res.ColorStateList;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;

View File

@ -20,11 +20,15 @@
package org.lsposed.manager.ui.activity; package org.lsposed.manager.ui.activity;
import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent; import android.view.MotionEvent;
@ -281,6 +285,16 @@ public class SettingsActivity extends BaseActivity {
return true; return true;
}); });
} }
SwitchPreference prefShowHiddenIcons = findPreference("show_hidden_icon_apps_enabled");
if (prefShowHiddenIcons != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
&& requireActivity().checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) == PackageManager.PERMISSION_GRANTED) {
prefShowHiddenIcons.setVisible(true);
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));
}
} }
@Override @Override

View File

@ -152,6 +152,8 @@
<string name="dns_over_http_summary">解决某些地区的 DNS 污染问题</string> <string name="dns_over_http_summary">解决某些地区的 DNS 污染问题</string>
<string name="theme_color">主题颜色</string> <string name="theme_color">主题颜色</string>
<string name="theme_color_summary">应用中最常见的颜色</string> <string name="theme_color_summary">应用中最常见的颜色</string>
<string name="settings_show_hidden_icon_apps_enabled">Android10+ 系统的强制显示应用桌面图标功能</string>
<string name="settings_group_system">系统</string>
<!-- Module Repo --> <!-- Module Repo -->
<string name="module_readme">自述文件</string> <string name="module_readme">自述文件</string>

View File

@ -152,6 +152,8 @@
<string name="dns_over_http_summary">Workaround DNS poisoning in some nations</string> <string name="dns_over_http_summary">Workaround DNS poisoning in some nations</string>
<string name="theme_color">Theme color</string> <string name="theme_color">Theme color</string>
<string name="theme_color_summary">Color that appears most frequently in the app</string> <string name="theme_color_summary">Color that appears most frequently in the app</string>
<string name="settings_show_hidden_icon_apps_enabled">Forced display of the application launcher icon on Android 10+</string>
<string name="settings_group_system">System</string>
<!-- Module Repo --> <!-- Module Repo -->
<string name="module_readme">Readme</string> <string name="module_readme">Readme</string>

View File

@ -18,10 +18,9 @@
~ Copyright (C) 2021 LSPosed Contributors ~ Copyright (C) 2021 LSPosed Contributors
--> -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
<com.takisoft.preferencex.PreferenceCategory xmlns:app="http://schemas.android.com/apk/res-auto">
android:key="group_network" <com.takisoft.preferencex.PreferenceCategory android:title="@string/group_network">
android:title="@string/group_network">
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
@ -53,9 +52,7 @@
android:summary="@string/pure_black_dark_theme_summary" /> android:summary="@string/pure_black_dark_theme_summary" />
</com.takisoft.preferencex.PreferenceCategory> </com.takisoft.preferencex.PreferenceCategory>
<com.takisoft.preferencex.PreferenceCategory <com.takisoft.preferencex.PreferenceCategory android:title="@string/settings_group_framework">
android:key="group_framework"
android:title="@string/settings_group_framework">
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
@ -73,7 +70,6 @@
</com.takisoft.preferencex.PreferenceCategory> </com.takisoft.preferencex.PreferenceCategory>
<com.takisoft.preferencex.PreferenceCategory <com.takisoft.preferencex.PreferenceCategory
android:key="group_backup"
android:title="@string/settings_backup_and_restore" android:title="@string/settings_backup_and_restore"
android:summary="@string/settings_backup_and_restore_summery" android:summary="@string/settings_backup_and_restore_summery"
android:icon="@drawable/ic_baseline_settings_backup_restore_24"> android:icon="@drawable/ic_baseline_settings_backup_restore_24">
@ -84,4 +80,14 @@
android:key="restore" android:key="restore"
android:title="@string/settings_restore" /> android:title="@string/settings_restore" />
</com.takisoft.preferencex.PreferenceCategory> </com.takisoft.preferencex.PreferenceCategory>
<com.takisoft.preferencex.PreferenceCategory
android:title="@string/settings_group_system">
<SwitchPreference
android:defaultValue="true"
android:key="show_hidden_icon_apps_enabled"
android:title="@string/settings_show_hidden_icon_apps_enabled"
android:persistent="false"
android:visible="false" />
</com.takisoft.preferencex.PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View File

@ -34,7 +34,6 @@ namespace lspd {
extern void *sym_openInMemoryDexFilesNative; extern void *sym_openInMemoryDexFilesNative;
extern void *sym_createCookieWithArray; extern void *sym_createCookieWithArray;
extern void *sym_createCookieWithDirectBuffer; extern void *sym_createCookieWithDirectBuffer;
extern void *sym_openInMemoryDexFilesNative;
extern void *sym_openDexFileNative; extern void *sym_openDexFileNative;
extern void *sym_setTrusted; extern void *sym_setTrusted;

View File

@ -53,6 +53,7 @@ import java.nio.channels.FileChannel;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -62,6 +63,11 @@ import java.util.concurrent.ConcurrentHashMap;
// This config manager assume uid won't change when our service is off. // This config manager assume uid won't change when our service is off.
// Otherwise, user should maintain it manually. // Otherwise, user should maintain it manually.
public class ConfigManager { public class ConfigManager {
private static final String[] MANAGER_PERMISSIONS_TO_GRANT = new String[]{
"android.permission.INTERACT_ACROSS_USERS",
"android.permission.WRITE_SECURE_SETTINGS"
};
static ConfigManager instance = null; static ConfigManager instance = null;
private static final File basePath = new File("/data/adb/lspd"); private static final File basePath = new File("/data/adb/lspd");
@ -618,11 +624,14 @@ public class ConfigManager {
} }
public static void grantManagerPermission() { public static void grantManagerPermission() {
String managerPackageName = readText(managerPath, BuildConfig.DEFAULT_MANAGER_PACKAGE_NAME);
Arrays.stream(MANAGER_PERMISSIONS_TO_GRANT).forEach(permission -> {
try { try {
PackageService.grantRuntimePermission(readText(managerPath, BuildConfig.DEFAULT_MANAGER_PACKAGE_NAME), "android.permission.INTERACT_ACROSS_USERS", 0); PackageService.grantRuntimePermission(managerPackageName, permission, 0);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(e)); Log.e(TAG, Log.getStackTraceString(e));
} }
});
} }
public boolean isModule(int uid) { public boolean isModule(int uid) {

View File

@ -12,5 +12,4 @@
# org.gradle.parallel=true # org.gradle.parallel=true
#Sat Jan 30 19:20:27 CST 202130.0.322.0.7026061 #Sat Jan 30 19:20:27 CST 202130.0.322.0.7026061
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true
android.enableResourceOptimizations=false android.enableResourceOptimizations=false