Better tips for framework not installed (#62)

* Remove skip min version check

* Better tips for framework not installed

* Disable framework settings if not installed
This commit is contained in:
tehcneko 2021-02-03 22:03:33 +08:00 committed by GitHub
parent 8b69bdd30d
commit 94a1ba826e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 79 additions and 124 deletions

View File

@ -3,10 +3,12 @@ package io.github.lsposed.manager.ui.activity;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.google.android.material.snackbar.Snackbar;
import java.util.Locale; import java.util.Locale;
@ -28,11 +30,6 @@ public class MainActivity extends BaseActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater()); binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot()); setContentView(binding.getRoot());
binding.modules.setOnClickListener(v -> {
Intent intent = new Intent();
intent.setClass(getApplicationContext(), ModulesActivity.class);
startActivity(intent);
});
binding.status.setOnClickListener(v -> { binding.status.setOnClickListener(v -> {
if (Constants.getXposedVersionCode() != -1) { if (Constants.getXposedVersionCode() != -1) {
new StatusDialogBuilder(this) new StatusDialogBuilder(this)
@ -43,21 +40,10 @@ public class MainActivity extends BaseActivity {
NavUtil.startURL(this, getString(R.string.about_source)); NavUtil.startURL(this, getString(R.string.about_source));
} }
}); });
binding.settings.setOnClickListener(v -> { binding.modules.setOnClickListener(new StartActivityListener(ModulesActivity.class, true));
Intent intent = new Intent(); binding.logs.setOnClickListener(new StartActivityListener(LogsActivity.class, true));
intent.setClass(getApplicationContext(), SettingsActivity.class); binding.settings.setOnClickListener(new StartActivityListener(SettingsActivity.class, false));
startActivity(intent); binding.about.setOnClickListener(new StartActivityListener(AboutActivity.class, false));
});
binding.logs.setOnClickListener(v -> {
Intent intent = new Intent();
intent.setClass(getApplicationContext(), LogsActivity.class);
startActivity(intent);
});
binding.about.setOnClickListener(v -> {
Intent intent = new Intent();
intent.setClass(getApplicationContext(), AboutActivity.class);
startActivity(intent);
});
Glide.with(binding.appIcon) Glide.with(binding.appIcon)
.load(GlideHelper.wrapApplicationInfoForIconLoader(getApplicationInfo())) .load(GlideHelper.wrapApplicationInfoForIconLoader(getApplicationInfo()))
.into(binding.appIcon); .into(binding.appIcon);
@ -78,6 +64,28 @@ public class MainActivity extends BaseActivity {
binding.statusSummary.setText(R.string.InstallDetail); binding.statusSummary.setText(R.string.InstallDetail);
binding.status.setCardBackgroundColor(ContextCompat.getColor(this, R.color.colorInstall)); binding.status.setCardBackgroundColor(ContextCompat.getColor(this, R.color.colorInstall));
binding.statusIcon.setImageResource(R.drawable.ic_error); binding.statusIcon.setImageResource(R.drawable.ic_error);
Snackbar.make(binding.snackbar, R.string.lsposed_not_active, Snackbar.LENGTH_LONG).show();
}
}
private class StartActivityListener implements View.OnClickListener {
boolean requireInstalled;
Class<?> clazz;
StartActivityListener(Class<?> clazz, boolean requireInstalled) {
this.clazz = clazz;
this.requireInstalled = requireInstalled;
}
@Override
public void onClick(View v) {
if (requireInstalled && Constants.getXposedVersion() == null) {
Snackbar.make(binding.snackbar, R.string.lsposed_not_active, Snackbar.LENGTH_LONG).show();
} else {
Intent intent = new Intent();
intent.setClass(MainActivity.this, clazz);
startActivity(intent);
}
} }
} }

View File

@ -3,9 +3,16 @@ package io.github.lsposed.manager.ui.activity;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.Typeface;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;
import android.text.style.TypefaceSpan;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
@ -18,6 +25,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -42,7 +50,6 @@ import static android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS;
public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleListener { public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleListener {
ActivityAppListBinding binding; ActivityAppListBinding binding;
private int installedXposedVersion;
private ApplicationFilter filter; private ApplicationFilter filter;
private SearchView searchView; private SearchView searchView;
private SearchView.OnQueryTextListener mSearchListener; private SearchView.OnQueryTextListener mSearchListener;
@ -105,14 +112,6 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
filter = new ApplicationFilter(); filter = new ApplicationFilter();
moduleUtil = ModuleUtil.getInstance(); moduleUtil = ModuleUtil.getInstance();
pm = getPackageManager(); pm = getPackageManager();
installedXposedVersion = Constants.getXposedApiVersion();
if (installedXposedVersion <= 0) {
Snackbar.make(binding.snackbar, R.string.xposed_not_active, Snackbar.LENGTH_LONG).setAction(R.string.Settings, v -> {
Intent intent = new Intent();
intent.setClass(ModulesActivity.this, SettingsActivity.class);
startActivity(intent);
}).show();
}
adapter = new ModuleAdapter(); adapter = new ModuleAdapter();
adapter.setHasStableIds(true); adapter.setHasStableIds(true);
moduleUtil.addListener(this); moduleUtil.addListener(this);
@ -269,33 +268,38 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
.load(item.getPackageInfo()) .load(item.getPackageInfo())
.into(holder.appIcon); .into(holder.appIcon);
TextView descriptionText = holder.appDescription; SpannableStringBuilder sb = new SpannableStringBuilder();
descriptionText.setVisibility(View.VISIBLE);
if (!item.getDescription().isEmpty()) { if (!item.getDescription().isEmpty()) {
descriptionText.setText(item.getDescription()); sb.append(item.getDescription());
} else { } else {
descriptionText.setText(getString(R.string.module_empty_description)); sb.append(getString(R.string.module_empty_description));
} }
TextView warningText = holder.warningText;
int installedXposedVersion = Constants.getXposedApiVersion();
String warningText = null;
if (item.minVersion == 0) { if (item.minVersion == 0) {
warningText.setText(getString(R.string.no_min_version_specified)); warningText = getString(R.string.no_min_version_specified);
warningText.setVisibility(View.VISIBLE);
} else if (installedXposedVersion > 0 && item.minVersion > installedXposedVersion) { } else if (installedXposedVersion > 0 && item.minVersion > installedXposedVersion) {
warningText.setText(String.format(getString(R.string.warning_xposed_min_version), item.minVersion)); warningText = String.format(getString(R.string.warning_xposed_min_version), item.minVersion);
warningText.setVisibility(View.VISIBLE);
} else if (item.minVersion < ModuleUtil.MIN_MODULE_VERSION) { } else if (item.minVersion < ModuleUtil.MIN_MODULE_VERSION) {
warningText.setText(String.format(getString(R.string.warning_min_version_too_low), item.minVersion, ModuleUtil.MIN_MODULE_VERSION)); warningText = String.format(getString(R.string.warning_min_version_too_low), item.minVersion, ModuleUtil.MIN_MODULE_VERSION);
warningText.setVisibility(View.VISIBLE);
} else if (item.isInstalledOnExternalStorage()) { } else if (item.isInstalledOnExternalStorage()) {
warningText.setText(getString(R.string.warning_installed_on_external_storage)); warningText = getString(R.string.warning_installed_on_external_storage);
warningText.setVisibility(View.VISIBLE);
} else if (installedXposedVersion == 0 || (installedXposedVersion == -1)) {
warningText.setText(getString(R.string.not_installed_no_lollipop));
warningText.setVisibility(View.VISIBLE);
} else {
warningText.setVisibility(View.GONE);
} }
if (warningText != null) {
sb.append("\n");
sb.append(warningText);
final ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(ContextCompat.getColor(ModulesActivity.this, R.color.material_red_500));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
final TypefaceSpan typefaceSpan = new TypefaceSpan(Typeface.create("sans-serif-medium", Typeface.NORMAL));
sb.setSpan(typefaceSpan, sb.length() - warningText.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
} else {
final StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
sb.setSpan(styleSpan, sb.length() - warningText.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
sb.setSpan(foregroundColorSpan, sb.length() - warningText.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
holder.appDescription.setText(sb);
} }
void addAll(ArrayList<ModuleUtil.InstalledModule> items) { void addAll(ArrayList<ModuleUtil.InstalledModule> items) {

View File

@ -22,6 +22,7 @@ import androidx.preference.Preference;
import androidx.preference.SwitchPreferenceCompat; import androidx.preference.SwitchPreferenceCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.snackbar.Snackbar;
import com.takisoft.preferencex.PreferenceFragmentCompat; import com.takisoft.preferencex.PreferenceFragmentCompat;
import com.takisoft.preferencex.SimpleMenuPreference; import com.takisoft.preferencex.SimpleMenuPreference;
@ -80,6 +81,9 @@ public class SettingsActivity extends BaseActivity {
return insets; return insets;
}); });
} }
if (Constants.getXposedVersion() == null) {
Snackbar.make(binding.snackbar, R.string.lsposed_not_active, Snackbar.LENGTH_LONG).show();
}
} }
private void restart() { private void restart() {
@ -127,20 +131,24 @@ public class SettingsActivity extends BaseActivity {
public void onCreatePreferencesFix(Bundle savedInstanceState, String rootKey) { public void onCreatePreferencesFix(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.prefs); addPreferencesFromResource(R.xml.prefs);
boolean installed = Constants.getXposedVersion() != null;
SwitchPreferenceCompat prefVerboseLogs = findPreference("disable_verbose_log"); SwitchPreferenceCompat prefVerboseLogs = findPreference("disable_verbose_log");
if (prefVerboseLogs != null) { if (prefVerboseLogs != null) {
prefVerboseLogs.setEnabled(installed);
prefVerboseLogs.setChecked(Files.exists(disableVerboseLogsFlag)); 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.setEnabled(installed);
prefModulesLogs.setChecked(Files.exists(disableModulesLogsFlag)); prefModulesLogs.setChecked(Files.exists(disableModulesLogsFlag));
prefModulesLogs.setOnPreferenceChangeListener(new OnFlagChangeListener(disableModulesLogsFlag)); prefModulesLogs.setOnPreferenceChangeListener(new OnFlagChangeListener(disableModulesLogsFlag));
} }
SwitchPreferenceCompat prefEnableResources = findPreference("enable_resources"); SwitchPreferenceCompat prefEnableResources = findPreference("enable_resources");
if (prefEnableResources != null) { if (prefEnableResources != null) {
prefEnableResources.setEnabled(installed);
prefEnableResources.setChecked(Files.exists(enableResourcesFlag)); prefEnableResources.setChecked(Files.exists(enableResourcesFlag));
prefEnableResources.setOnPreferenceChangeListener(new OnFlagChangeListener(enableResourcesFlag)); prefEnableResources.setOnPreferenceChangeListener(new OnFlagChangeListener(enableResourcesFlag));
} }
@ -150,6 +158,7 @@ public class SettingsActivity extends BaseActivity {
if (StatusDialogBuilder.getArch().contains("x86") || requireActivity().getApplicationInfo().uid / 100000 != 0) { if (StatusDialogBuilder.getArch().contains("x86") || requireActivity().getApplicationInfo().uid / 100000 != 0) {
prefVariant.setVisible(false); prefVariant.setVisible(false);
} else { } else {
prefVariant.setEnabled(installed);
try { try {
prefVariant.setValue(new String(Files.readAllBytes(variantFlag)).trim()); prefVariant.setValue(new String(Files.readAllBytes(variantFlag)).trim());
} catch (Exception e) { } catch (Exception e) {

View File

@ -1,6 +1,5 @@
package io.github.lsposed.manager.util; package io.github.lsposed.manager.util;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@ -33,12 +32,10 @@ public final class ModuleUtil {
private Map<String, InstalledModule> installedModules; private Map<String, InstalledModule> installedModules;
private final List<String> enabledModules; private final List<String> enabledModules;
private boolean isReloading = false; private boolean isReloading = false;
private final SharedPreferences prefs;
private ModuleUtil() { private ModuleUtil() {
pm = App.getInstance().getPackageManager(); pm = App.getInstance().getPackageManager();
enabledModules = AppHelper.getEnabledModuleList(); enabledModules = AppHelper.getEnabledModuleList();
prefs = App.getPreferences();
} }
public static synchronized ModuleUtil getInstance() { public static synchronized ModuleUtil getInstance() {
@ -225,10 +222,6 @@ public final class ModuleUtil {
if (isFramework) { if (isFramework) {
this.minVersion = 0; this.minVersion = 0;
this.description = ""; this.description = "";
} else {
int version = Constants.getXposedApiVersion();
if (version > 0 && prefs.getBoolean("skip_xposedminversion_check", false)) {
this.minVersion = version;
} else { } else {
Object minVersionRaw = app.metaData.get("xposedminversion"); Object minVersionRaw = app.metaData.get("xposedminversion");
if (minVersionRaw instanceof Integer) { if (minVersionRaw instanceof Integer) {
@ -240,7 +233,6 @@ public final class ModuleUtil {
} }
} }
} }
}
public boolean isInstalledOnExternalStorage() { public boolean isInstalledOnExternalStorage() {
return (app.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0; return (app.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0;

View File

@ -74,7 +74,6 @@
android:layout_width="28dp" android:layout_width="28dp"
android:layout_height="28dp" android:layout_height="28dp"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:contentDescription="@string/Activated"
app:srcCompat="@drawable/ic_check_circle" app:srcCompat="@drawable/ic_check_circle"
app:tint="@android:color/white" /> app:tint="@android:color/white" />
@ -84,7 +83,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="25dp" android:layout_marginStart="25dp"
android:layout_toEndOf="@id/status_icon" android:layout_toEndOf="@id/status_icon"
android:text="@string/Activated"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@android:color/white" /> android:textColor="@android:color/white" />
@ -95,7 +93,6 @@
android:layout_below="@id/status_title" android:layout_below="@id/status_title"
android:layout_alignStart="@id/status_title" android:layout_alignStart="@id/status_title"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:text="@string/ActivatedDetail"
android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textColor="@android:color/white" /> android:textColor="@android:color/white" />
</RelativeLayout> </RelativeLayout>

View File

@ -85,18 +85,5 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/warning"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginBottom="8dp"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/material_red_500"
android:visibility="gone"
app:layout_constraintStart_toStartOf="@+id/description"
app:layout_constraintTop_toBottomOf="@+id/description"
tools:text="@tools:sample/lorem" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout> </FrameLayout>

View File

@ -4,7 +4,6 @@
<item <item
android:id="@+id/menu_search" android:id="@+id/menu_search"
android:title="@string/menuSearch"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />

View File

@ -4,7 +4,6 @@
<item <item
android:id="@+id/menu_search" android:id="@+id/menu_search"
android:title="@string/menuSearch"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
</menu> </menu>

View File

@ -3,7 +3,6 @@
<string name="Activated">已激活</string> <string name="Activated">已激活</string>
<string name="Install">安装</string> <string name="Install">安装</string>
<string name="InstallDetail">点按安装 LSPosed</string> <string name="InstallDetail">点按安装 LSPosed</string>
<string name="ActivatedDetail">LSPosed 框架已激活</string>
<string name="Modules">模块</string> <string name="Modules">模块</string>
<string name="ModulesDetail">%d 模块已启用</string> <string name="ModulesDetail">%d 模块已启用</string>
<string name="Logs">日志</string> <string name="Logs">日志</string>
@ -22,7 +21,6 @@
<string name="nav_item_logs_err">模块日志</string> <string name="nav_item_logs_err">模块日志</string>
<!-- Installer tab --> <!-- Installer tab -->
<string name="areyousure">您确定?</string>
<string name="install_warning_title">请小心!</string> <string name="install_warning_title">请小心!</string>
<string name="dont_show_again">不再提示</string> <string name="dont_show_again">不再提示</string>
@ -42,12 +40,10 @@
<string name="module_uninstall">卸载</string> <string name="module_uninstall">卸载</string>
<!-- Download tab --> <!-- Download tab -->
<string name="menuSearch">搜索</string>
<string name="menuReload">重新加载</string> <string name="menuReload">重新加载</string>
<!-- Settings tab --> <!-- Settings tab -->
<string name="settings_group_framework">框架</string> <string name="settings_group_framework">框架</string>
<string name="settings_group_app">应用</string>
<string name="settings_theme">主题</string> <string name="settings_theme">主题</string>
<string name="settings_theme_light">亮色</string> <string name="settings_theme_light">亮色</string>
<string name="settings_theme_dark">暗色</string> <string name="settings_theme_dark">暗色</string>
@ -73,13 +69,10 @@
<string name="warning_installed_on_external_storage">此模块因被安装在 SD 卡中而导致无法加载, 请将其移动到内部存储</string> <string name="warning_installed_on_external_storage">此模块因被安装在 SD 卡中而导致无法加载, 请将其移动到内部存储</string>
<string name="info">信息</string> <string name="info">信息</string>
<string name="not_installed_no_lollipop">LSPosed 框架未安装</string>
<string name="scroll_top">滚动到顶部</string> <string name="scroll_top">滚动到顶部</string>
<string name="loading">正在加载…</string> <string name="loading">正在加载…</string>
<string name="scroll_bottom">滚动到底部</string> <string name="scroll_bottom">滚动到底部</string>
<string name="skip_xposedminversion_check">关闭状态检查</string>
<string name="skip_xposedminversion_check_summ">关闭针对模块的\“LSPosed 安装状态\”检查</string>
<string name="not_logcat">此处仅显示 LSPosed 及模块相关日志信息\n如果您想抓取系统日志, 可以尝试我们的 Log Catcher Magisk 模块</string> <string name="not_logcat">此处仅显示 LSPosed 及模块相关日志信息\n如果您想抓取系统日志, 可以尝试我们的 Log Catcher Magisk 模块</string>
<!-- LSPd related --> <!-- LSPd related -->
@ -95,9 +88,7 @@
<string name="pref_title_disable_modules_log">禁用模块日志</string> <string name="pref_title_disable_modules_log">禁用模块日志</string>
<string name="pref_disable_modules_log_summary">模块抛出的的异常堆栈仍将正常抓取</string> <string name="pref_disable_modules_log_summary">模块抛出的的异常堆栈仍将正常抓取</string>
<string name="follow_system">跟随系统</string> <string name="follow_system">跟随系统</string>
<string name="pure_black_dark_theme">使用纯黑深色主题</string><![CDATA[> <string name="pure_black_dark_theme">使用纯黑深色主题</string>
]]>
<string name="xposed_not_active">LSPosed 框架未安装或未激活, 您可在设置中关闭状态检查</string>
<string name="transparent_status_bar">透明状态栏</string> <string name="transparent_status_bar">透明状态栏</string>
<string name="sort_by_name">应用名称</string> <string name="sort_by_name">应用名称</string>
<string name="sort_by_name_reverse">应用名称(降序)</string> <string name="sort_by_name_reverse">应用名称(降序)</string>
@ -135,4 +126,5 @@
<string name="selinux_permissive">&lt;b&gt;警告:&lt;\/b&gt;SELinux 未处于严格模式!对此进行攻击的恶意程序可以完全控制你的设备,并可能造成你的财产损失和法律责任。</string> <string name="selinux_permissive">&lt;b&gt;警告:&lt;\/b&gt;SELinux 未处于严格模式!对此进行攻击的恶意程序可以完全控制你的设备,并可能造成你的财产损失和法律责任。</string>
<string name="selinux_permissive_summary">SELinux 未处于严格模式!</string> <string name="selinux_permissive_summary">SELinux 未处于严格模式!</string>
<string name="outdated_manager">LSPosed Manager 和 LSPosed Core 的版本不一致。请重新安装对应的版本。</string> <string name="outdated_manager">LSPosed Manager 和 LSPosed Core 的版本不一致。请重新安装对应的版本。</string>
<string name="lsposed_not_active">LSPosed 未安装或未激活</string>
</resources> </resources>

View File

@ -3,7 +3,6 @@
<string name="Activated">已激活</string> <string name="Activated">已激活</string>
<string name="Install">安裝</string> <string name="Install">安裝</string>
<string name="InstallDetail">點按安裝 LSPosed</string> <string name="InstallDetail">點按安裝 LSPosed</string>
<string name="ActivatedDetail">LSPosed 框架已激活</string>
<string name="Modules">模塊</string> <string name="Modules">模塊</string>
<string name="ModulesDetail">%d 模塊已啟用</string> <string name="ModulesDetail">%d 模塊已啟用</string>
<string name="Logs">日誌</string> <string name="Logs">日誌</string>
@ -21,7 +20,6 @@
<string name="nav_item_logs_err">模塊日誌</string> <string name="nav_item_logs_err">模塊日誌</string>
<!-- Installer tab --> <!-- Installer tab -->
<string name="areyousure">您確定?</string>
<string name="install_warning_title">請小心!</string> <string name="install_warning_title">請小心!</string>
<string name="dont_show_again">不再提示</string> <string name="dont_show_again">不再提示</string>
@ -41,12 +39,10 @@
<string name="module_uninstall">卸載</string> <string name="module_uninstall">卸載</string>
<!-- Download tab --> <!-- Download tab -->
<string name="menuSearch">搜索</string>
<string name="menuReload">重新加載</string> <string name="menuReload">重新加載</string>
<!-- Settings tab --> <!-- Settings tab -->
<string name="settings_group_framework">框架</string> <string name="settings_group_framework">框架</string>
<string name="settings_group_app">應用</string>
<string name="settings_theme">主題</string> <string name="settings_theme">主題</string>
<string name="settings_theme_light">亮色</string> <string name="settings_theme_light">亮色</string>
<string name="settings_theme_dark">暗色</string> <string name="settings_theme_dark">暗色</string>
@ -71,13 +67,10 @@
<string name="warning_installed_on_external_storage">此模塊因被安裝在 SD 卡中而導致無法加載, 請將其移動到內部存儲</string> <string name="warning_installed_on_external_storage">此模塊因被安裝在 SD 卡中而導致無法加載, 請將其移動到內部存儲</string>
<string name="info">信息</string> <string name="info">信息</string>
<string name="not_installed_no_lollipop">LSPosed 框架未安裝</string>
<string name="scroll_top">滾動到頂部</string> <string name="scroll_top">滾動到頂部</string>
<string name="loading">正在加載…</string> <string name="loading">正在加載…</string>
<string name="scroll_bottom">滾動到底部</string> <string name="scroll_bottom">滾動到底部</string>
<string name="skip_xposedminversion_check">關閉狀態檢查</string>
<string name="skip_xposedminversion_check_summ">關閉針對模塊的\"LSPosed 安裝狀態\"檢查</string>
<string name="not_logcat">此處僅顯示 LSPosed 及模塊相關日誌信息\n如果您想抓取系統日誌, 可以嘗試我們的 Log Catcher Magisk 模塊</string> <string name="not_logcat">此處僅顯示 LSPosed 及模塊相關日誌信息\n如果您想抓取系統日誌, 可以嘗試我們的 Log Catcher Magisk 模塊</string>
<!-- LSPd related --> <!-- LSPd related -->
@ -93,8 +86,8 @@
<string name="pref_disable_modules_log_summary">模塊拋出的的異常堆棧仍將正常抓取</string> <string name="pref_disable_modules_log_summary">模塊拋出的的異常堆棧仍將正常抓取</string>
<string name="follow_system">跟隨系統</string> <string name="follow_system">跟隨系統</string>
<string name="pure_black_dark_theme">使用純黑深色主題</string><![CDATA[> <string name="pure_black_dark_theme">使用純黑深色主題</string><![CDATA[>
]]> ]]>
<string name="xposed_not_active">LSPosed 框架未安裝或未激活, 您可在設置中關閉狀態檢查</string>
<string name="transparent_status_bar">透明狀態欄</string> <string name="transparent_status_bar">透明狀態欄</string>
<string name="sort_by_name">應用名稱</string> <string name="sort_by_name">應用名稱</string>
<string name="sort_by_name_reverse">應用名稱(降序)</string> <string name="sort_by_name_reverse">應用名稱(降序)</string>

View File

@ -3,7 +3,6 @@
<string name="Activated">已啟用</string> <string name="Activated">已啟用</string>
<string name="Install">安裝</string> <string name="Install">安裝</string>
<string name="InstallDetail">點按安裝 LSPosed</string> <string name="InstallDetail">點按安裝 LSPosed</string>
<string name="ActivatedDetail">LSPosed 框架已啟用</string>
<string name="Modules">模組</string> <string name="Modules">模組</string>
<string name="ModulesDetail">%d 模組已啟用</string> <string name="ModulesDetail">%d 模組已啟用</string>
<string name="Logs">日誌</string> <string name="Logs">日誌</string>
@ -22,7 +21,6 @@
<string name="nav_item_logs_err">模組日誌</string> <string name="nav_item_logs_err">模組日誌</string>
<!-- Installer tab --> <!-- Installer tab -->
<string name="areyousure">您確定?</string>
<string name="install_warning_title">請小心!</string> <string name="install_warning_title">請小心!</string>
<string name="dont_show_again">不再提示</string> <string name="dont_show_again">不再提示</string>
@ -42,12 +40,10 @@
<string name="module_uninstall">解除安裝</string> <string name="module_uninstall">解除安裝</string>
<!-- Download tab --> <!-- Download tab -->
<string name="menuSearch">搜尋</string>
<string name="menuReload">重新載入</string> <string name="menuReload">重新載入</string>
<!-- Settings tab --> <!-- Settings tab -->
<string name="settings_group_framework">框架</string> <string name="settings_group_framework">框架</string>
<string name="settings_group_app">程式</string>
<string name="settings_theme">主題</string> <string name="settings_theme">主題</string>
<string name="settings_theme_light">亮色</string> <string name="settings_theme_light">亮色</string>
<string name="settings_theme_dark">暗色</string> <string name="settings_theme_dark">暗色</string>
@ -73,13 +69,10 @@
<string name="warning_installed_on_external_storage">此模組因被安裝在 SD 卡中而導致無法載入, 請將其移動到內部儲存</string> <string name="warning_installed_on_external_storage">此模組因被安裝在 SD 卡中而導致無法載入, 請將其移動到內部儲存</string>
<string name="info">資訊</string> <string name="info">資訊</string>
<string name="not_installed_no_lollipop">LSPosed 框架未安裝</string>
<string name="scroll_top">滾動到頂部</string> <string name="scroll_top">滾動到頂部</string>
<string name="loading">正在載入…</string> <string name="loading">正在載入…</string>
<string name="scroll_bottom">滾動到底部</string> <string name="scroll_bottom">滾動到底部</string>
<string name="skip_xposedminversion_check">關閉狀態檢查</string>
<string name="skip_xposedminversion_check_summ">關閉針對模組的\"LSPosed 安裝狀態\"檢查</string>
<string name="not_logcat">此處僅顯示 LSPosed 及模組相關日誌資訊\n如果您想抓取系統日誌, 可以嘗試我們的 Log Catcher Magisk 模組</string> <string name="not_logcat">此處僅顯示 LSPosed 及模組相關日誌資訊\n如果您想抓取系統日誌, 可以嘗試我們的 Log Catcher Magisk 模組</string>
<!-- LSPd related --> <!-- LSPd related -->
@ -96,8 +89,8 @@
<string name="pref_disable_modules_log_summary">模組丟擲的的異常堆疊仍將正常抓取</string> <string name="pref_disable_modules_log_summary">模組丟擲的的異常堆疊仍將正常抓取</string>
<string name="follow_system">跟隨系統</string> <string name="follow_system">跟隨系統</string>
<string name="pure_black_dark_theme">使用純黑深色主題</string><![CDATA[> <string name="pure_black_dark_theme">使用純黑深色主題</string><![CDATA[>
]]> ]]>
<string name="xposed_not_active">LSPosed 框架未安裝或未啟用, 您可在設定中關閉狀態檢查</string>
<string name="transparent_status_bar">透明狀態列</string> <string name="transparent_status_bar">透明狀態列</string>
<string name="sort_by_name">程式名稱</string> <string name="sort_by_name">程式名稱</string>
<string name="sort_by_name_reverse">程式名稱(降序)</string> <string name="sort_by_name_reverse">程式名稱(降序)</string>

View File

@ -3,7 +3,6 @@
<string name="Activated">Activated</string> <string name="Activated">Activated</string>
<string name="Install">Install</string> <string name="Install">Install</string>
<string name="InstallDetail">Tap to install LSPosed</string> <string name="InstallDetail">Tap to install LSPosed</string>
<string name="ActivatedDetail">LSPosed is activated</string>
<string name="Modules">Modules</string> <string name="Modules">Modules</string>
<string name="ModulesDetail">%d modules enabled</string> <string name="ModulesDetail">%d modules enabled</string>
<string name="Logs">Logs</string> <string name="Logs">Logs</string>
@ -23,7 +22,6 @@
<string name="nav_item_logs_err">Modules Logs</string> <string name="nav_item_logs_err">Modules Logs</string>
<!-- Installer tab --> <!-- Installer tab -->
<string name="areyousure">Are you sure?</string>
<string name="install_warning_title">Be careful!</string> <string name="install_warning_title">Be careful!</string>
<string name="dont_show_again">Don\'t show this again</string> <string name="dont_show_again">Don\'t show this again</string>
@ -43,14 +41,12 @@
<string name="module_uninstall">Uninstall</string> <string name="module_uninstall">Uninstall</string>
<!-- Download tab --> <!-- Download tab -->
<string name="menuSearch">Search</string>
<string name="menuReload">Reload</string> <string name="menuReload">Reload</string>
<!-- Settings tab --> <!-- Settings tab -->
<string name="settings_group_framework">Framework</string> <string name="settings_group_framework">Framework</string>
<string name="settings_enable_resources">Enable resource hooks</string> <string name="settings_enable_resources">Enable resource hooks</string>
<string name="settings_enable_resources_summary"><b>WARNING:</b> Resource hooks are deprecated</string> <string name="settings_enable_resources_summary"><b>WARNING:</b> Resource hooks are deprecated</string>
<string name="settings_group_app">Application</string>
<string name="settings_theme">Theme</string> <string name="settings_theme">Theme</string>
<string name="settings_theme_light">Light</string> <string name="settings_theme_light">Light</string>
<string name="settings_theme_dark">Dark</string> <string name="settings_theme_dark">Dark</string>
@ -76,13 +72,10 @@
<string name="warning_installed_on_external_storage">This module cannot be loaded because it\'s installed on the SD card, please move it to internal storage</string> <string name="warning_installed_on_external_storage">This module cannot be loaded because it\'s installed on the SD card, please move it to internal storage</string>
<string name="info">Info</string> <string name="info">Info</string>
<string name="not_installed_no_lollipop">LSPosed Framework is not installed</string>
<string name="scroll_top">Scroll to top</string> <string name="scroll_top">Scroll to top</string>
<string name="loading">Loading…</string> <string name="loading">Loading…</string>
<string name="scroll_bottom">Scroll to bottom</string> <string name="scroll_bottom">Scroll to bottom</string>
<string name="skip_xposedminversion_check">Skip status check</string>
<string name="skip_xposedminversion_check_summ">Skip \"LSPosed Status\" check for modules</string>
<string name="android_sdk" translatable="false">Android %2$s (%1$s, API %3$d)</string> <string name="android_sdk" translatable="false">Android %2$s (%1$s, API %3$d)</string>
<string name="not_logcat">This is the LSPosed Framework and modules log\nif you need a Android logcat, you can try our Log Catcher Magisk module</string> <string name="not_logcat">This is the LSPosed Framework and modules log\nif you need a Android logcat, you can try our Log Catcher Magisk module</string>
@ -106,7 +99,6 @@
<string name="pref_disable_modules_log_summary">Exception stack thrown by the module will still be catched normally</string> <string name="pref_disable_modules_log_summary">Exception stack thrown by the module will still be catched normally</string>
<string name="pure_black_dark_theme">Use the pure black dark theme</string> <string name="pure_black_dark_theme">Use the pure black dark theme</string>
<string name="follow_system">Follow system</string> <string name="follow_system">Follow system</string>
<string name="xposed_not_active">LSPosed Framework is not currently installed or active\nYou can close status check in settings</string>
<string name="transparent_status_bar">Transparent status bar</string> <string name="transparent_status_bar">Transparent status bar</string>
<string name="sort_by_name">Sort by application name</string> <string name="sort_by_name">Sort by application name</string>
<string name="sort_by_name_reverse">Sort by application name (reverse)</string> <string name="sort_by_name_reverse">Sort by application name (reverse)</string>
@ -142,4 +134,5 @@
<string name="selinux_permissive">&lt;b&gt;WARNING:&lt;\/b&gt; SELinux is not enforcing! the malicious program that attacks this can completely control your device and may cause your property damage and legal liability.</string> <string name="selinux_permissive">&lt;b&gt;WARNING:&lt;\/b&gt; SELinux is not enforcing! the malicious program that attacks this can completely control your device and may cause your property damage and legal liability.</string>
<string name="selinux_permissive_summary">SELinux is not enforcing!</string> <string name="selinux_permissive_summary">SELinux is not enforcing!</string>
<string name="outdated_manager">Version of LSPosed Manager and LSPosed Core are not consistent. Please re-install the corresponding version.</string> <string name="outdated_manager">Version of LSPosed Manager and LSPosed Core are not consistent. Please re-install the corresponding version.</string>
<string name="lsposed_not_active">LSPosed is not currently installed or active.</string>
</resources> </resources>

View File

@ -1,17 +1,6 @@
<?xml version="1.0" encoding="utf-8"?><!--suppress ALL --> <?xml version="1.0" encoding="utf-8"?><!--suppress ALL -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
android:title="@string/settings_group_app"
app:iconSpaceReserved="false">
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="skip_xposedminversion_check"
android:summary="@string/skip_xposedminversion_check_summ"
android:title="@string/skip_xposedminversion_check"
app:iconSpaceReserved="false" />
</PreferenceCategory>
<PreferenceCategory <PreferenceCategory
android:title="@string/settings_group_theme" android:title="@string/settings_group_theme"
app:iconSpaceReserved="false"> app:iconSpaceReserved="false">