Add variant switch

This commit is contained in:
NekoInverter 2021-01-25 22:59:38 +08:00
parent 93df30024e
commit d482970284
No known key found for this signature in database
GPG Key ID: 280D6CCCF95715F9
6 changed files with 79 additions and 27 deletions

View File

@ -74,5 +74,4 @@ dependencies {
implementation 'tech.rectifier.preferencex-android:preferencex-simplemenu:88f93154b2' implementation 'tech.rectifier.preferencex-android:preferencex-simplemenu:88f93154b2'
implementation 'me.zhanghai.android.appiconloader:appiconloader-glide:1.2.0' implementation 'me.zhanghai.android.appiconloader:appiconloader-glide:1.2.0'
implementation 'me.zhanghai.android.fastscroll:library:1.1.5' implementation 'me.zhanghai.android.fastscroll:library:1.1.5'
compileOnly 'de.robv.android.xposed:api:82'
} }

View File

@ -15,6 +15,7 @@ import androidx.preference.Preference;
import androidx.preference.SwitchPreferenceCompat; import androidx.preference.SwitchPreferenceCompat;
import com.takisoft.preferencex.PreferenceFragmentCompat; import com.takisoft.preferencex.PreferenceFragmentCompat;
import com.takisoft.preferencex.SimpleMenuPreference;
import org.meowcat.edxposed.manager.Constants; import org.meowcat.edxposed.manager.Constants;
import org.meowcat.edxposed.manager.R; import org.meowcat.edxposed.manager.R;
@ -22,7 +23,10 @@ import org.meowcat.edxposed.manager.databinding.ActivitySettingsBinding;
import org.meowcat.edxposed.manager.ui.widget.IntegerListPreference; import org.meowcat.edxposed.manager.ui.widget.IntegerListPreference;
import org.meowcat.edxposed.manager.util.RepoLoader; import org.meowcat.edxposed.manager.util.RepoLoader;
import java.io.File; import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class SettingsActivity extends BaseActivity { public class SettingsActivity extends BaseActivity {
private static final String KEY_PREFIX = SettingsActivity.class.getName() + '.'; private static final String KEY_PREFIX = SettingsActivity.class.getName() + '.';
@ -97,15 +101,14 @@ public class SettingsActivity extends BaseActivity {
return restarting || super.dispatchGenericMotionEvent(event); return restarting || super.dispatchGenericMotionEvent(event);
} }
@SuppressWarnings({"ResultOfMethodCallIgnored"})
public static class SettingsFragment extends PreferenceFragmentCompat { public static class SettingsFragment extends PreferenceFragmentCompat {
private static final File enableResourcesFlag = new File(Constants.getBaseDir() + "conf/enable_resources"); private static final Path enableResourcesFlag = Paths.get(Constants.getBaseDir(), "conf/enable_resources");
private static final File deoptBootFlag = new File(Constants.getBaseDir() + "conf/deoptbootimage"); private static final Path deoptBootFlag = Paths.get(Constants.getBaseDir(), "conf/deoptbootimage");
private static final File whiteListModeFlag = new File(Constants.getBaseDir() + "conf/usewhitelist"); private static final Path whiteListModeFlag = Paths.get(Constants.getBaseDir(), "conf/usewhitelist");
private static final File disableVerboseLogsFlag = new File(Constants.getBaseDir() + "conf/disable_verbose_log"); private static final Path disableVerboseLogsFlag = Paths.get(Constants.getBaseDir(), "conf/disable_verbose_log");
private static final File disableModulesLogsFlag = new File(Constants.getBaseDir() + "conf/disable_modules_log"); private static final Path disableModulesLogsFlag = Paths.get(Constants.getBaseDir() + "conf/disable_modules_log");
private static final Path variantFlag = Paths.get(Constants.getBaseDir()).getParent().resolve("variant");
@SuppressLint({"ObsoleteSdkInt", "WorldReadableFiles"})
@Override @Override
public void onCreatePreferencesFix(Bundle savedInstanceState, String rootKey) { public void onCreatePreferencesFix(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.prefs); addPreferencesFromResource(R.xml.prefs);
@ -120,32 +123,55 @@ public class SettingsActivity extends BaseActivity {
SwitchPreferenceCompat prefWhiteListMode = findPreference("white_list_switch"); SwitchPreferenceCompat prefWhiteListMode = findPreference("white_list_switch");
if (prefWhiteListMode != null) { if (prefWhiteListMode != null) {
prefWhiteListMode.setChecked(whiteListModeFlag.exists()); prefWhiteListMode.setChecked(Files.exists(whiteListModeFlag));
prefWhiteListMode.setOnPreferenceChangeListener(new OnFlagChangeListener(whiteListModeFlag)); prefWhiteListMode.setOnPreferenceChangeListener(new OnFlagChangeListener(whiteListModeFlag));
} }
SwitchPreferenceCompat prefVerboseLogs = findPreference("disable_verbose_log"); SwitchPreferenceCompat prefVerboseLogs = findPreference("disable_verbose_log");
if (prefVerboseLogs != null) { if (prefVerboseLogs != null) {
prefVerboseLogs.setChecked(disableVerboseLogsFlag.exists()); prefVerboseLogs.setChecked(Files.exists(disableVerboseLogsFlag));
prefVerboseLogs.setOnPreferenceChangeListener(new OnFlagChangeListener(disableVerboseLogsFlag)); prefVerboseLogs.setOnPreferenceChangeListener(new OnFlagChangeListener(disableVerboseLogsFlag));
} }
SwitchPreferenceCompat prefModulesLogs = findPreference("disable_modules_log"); SwitchPreferenceCompat prefModulesLogs = findPreference("disable_modules_log");
if (prefModulesLogs != null) { if (prefModulesLogs != null) {
prefModulesLogs.setChecked(disableModulesLogsFlag.exists()); prefModulesLogs.setChecked(Files.exists(disableModulesLogsFlag));
prefModulesLogs.setOnPreferenceChangeListener(new OnFlagChangeListener(disableModulesLogsFlag)); prefModulesLogs.setOnPreferenceChangeListener(new OnFlagChangeListener(disableModulesLogsFlag));
} }
SwitchPreferenceCompat prefEnableDeopt = findPreference("enable_boot_image_deopt"); SwitchPreferenceCompat prefEnableDeopt = findPreference("enable_boot_image_deopt");
if (prefEnableDeopt != null) { if (prefEnableDeopt != null) {
prefEnableDeopt.setChecked(deoptBootFlag.exists()); prefEnableDeopt.setChecked(Files.exists(deoptBootFlag));
prefEnableDeopt.setOnPreferenceChangeListener(new OnFlagChangeListener(deoptBootFlag)); prefEnableDeopt.setOnPreferenceChangeListener(new OnFlagChangeListener(deoptBootFlag));
} }
SwitchPreferenceCompat prefDisableResources = findPreference("enable_resources"); SwitchPreferenceCompat prefEnableResources = findPreference("enable_resources");
if (prefDisableResources != null) { if (prefEnableResources != null) {
prefDisableResources.setChecked(!enableResourcesFlag.exists()); prefEnableResources.setChecked(Files.exists(enableResourcesFlag));
prefDisableResources.setOnPreferenceChangeListener(new OnFlagChangeListener(enableResourcesFlag)); prefEnableResources.setOnPreferenceChangeListener(new OnFlagChangeListener(enableResourcesFlag));
}
SimpleMenuPreference prefVariant = findPreference("variant");
if (prefVariant != null) {
if (requireActivity().getApplicationInfo().uid / 100000 != 0) {
prefVariant.setVisible(false);
} else {
try {
prefVariant.setValue(new String(Files.readAllBytes(variantFlag)).trim());
} catch (Exception e) {
e.printStackTrace();
}
prefVariant.setOnPreferenceChangeListener((preference, newValue) -> {
try {
Files.write(variantFlag, ((String) newValue).getBytes());
return true;
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();
return false;
}
});
}
} }
SwitchPreferenceCompat transparent = findPreference("transparent_status_bar"); SwitchPreferenceCompat transparent = findPreference("transparent_status_bar");
@ -246,25 +272,26 @@ public class SettingsActivity extends BaseActivity {
} }
private class OnFlagChangeListener implements Preference.OnPreferenceChangeListener { private class OnFlagChangeListener implements Preference.OnPreferenceChangeListener {
private final File flag; private final Path flag;
OnFlagChangeListener(File flag) { OnFlagChangeListener(Path flag) {
this.flag = flag; this.flag = flag;
} }
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean enabled = (Boolean) newValue; boolean enabled = (Boolean) newValue;
if (enabled) { try {
try { if (enabled) {
flag.createNewFile(); Files.createFile(flag);
} catch (Exception e) { } else {
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show(); Files.delete(flag);
} }
} else { } catch (Exception e) {
flag.delete(); e.printStackTrace();
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();
} }
return (enabled == flag.exists()); return (enabled == Files.exists(flag));
} }
} }
} }

View File

@ -313,4 +313,7 @@
<string name="menu_scope">作用域</string> <string name="menu_scope">作用域</string>
<string name="enable_scope">启用作用域</string> <string name="enable_scope">启用作用域</string>
<string name="scope_not_supported">您安装的 LSPosed 版本不支持模块作用域,下载新版本?</string> <string name="scope_not_supported">您安装的 LSPosed 版本不支持模块作用域,下载新版本?</string>
<string name="settings_enable_resources">启用资源钩子</string>
<string name="settings_enable_resources_summary"><b>警告: </b> 资源钩子已被弃用</string>
<string name="settings_variant">变体</string>
</resources> </resources>

View File

@ -65,4 +65,13 @@
<item>experimental</item> <item>experimental</item>
</string-array> </string-array>
<string-array name="variant_texts" translatable="false">
<item>YAHFA</item>
<item>SandHook</item>
</string-array>
<string-array name="variant_values" translatable="false">
<item>1</item>
<item>2</item>
</string-array>
</resources> </resources>

View File

@ -115,6 +115,15 @@
android:title="@string/settings_group_framework" android:title="@string/settings_group_framework"
app:iconSpaceReserved="false"> app:iconSpaceReserved="false">
<SimpleMenuPreference
android:defaultValue="1"
android:entries="@array/variant_texts"
android:entryValues="@array/variant_values"
android:key="variant"
android:summary="%s"
android:title="@string/settings_variant"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:defaultValue="false" android:defaultValue="false"
android:key="white_list_switch" android:key="white_list_switch"

View File

@ -322,6 +322,11 @@ namespace edxp {
if (pkg_name == "android") uid = -1; if (pkg_name == "android") uid = -1;
path_chown(conf_path, uid, 1000u, true); path_chown(conf_path, uid, 1000u, true);
path_chown(log_path, uid, 1000u, true); path_chown(log_path, uid, 1000u, true);
if (current_user_ == 0) {
auto variant = GetMiscPath() / "variant";
fs::permissions(variant, fs::perms::owner_all | fs::perms::group_all);
chown(variant.c_str(), uid, 1000u);
}
if (pkg_name == kPrimaryInstallerPkgName) { if (pkg_name == kPrimaryInstallerPkgName) {
auto installer_pkg_name_path = GetConfigPath("installer"); auto installer_pkg_name_path = GetConfigPath("installer");