diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/MainActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/MainActivity.java index 427b0555..30d3d0a1 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/MainActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/MainActivity.java @@ -3,10 +3,12 @@ package io.github.lsposed.manager.ui.activity; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; +import android.view.View; import androidx.core.content.ContextCompat; import com.bumptech.glide.Glide; +import com.google.android.material.snackbar.Snackbar; import java.util.Locale; @@ -28,11 +30,6 @@ public class MainActivity extends BaseActivity { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - binding.modules.setOnClickListener(v -> { - Intent intent = new Intent(); - intent.setClass(getApplicationContext(), ModulesActivity.class); - startActivity(intent); - }); binding.status.setOnClickListener(v -> { if (Constants.getXposedVersionCode() != -1) { new StatusDialogBuilder(this) @@ -43,21 +40,10 @@ public class MainActivity extends BaseActivity { NavUtil.startURL(this, getString(R.string.about_source)); } }); - binding.settings.setOnClickListener(v -> { - Intent intent = new Intent(); - intent.setClass(getApplicationContext(), SettingsActivity.class); - startActivity(intent); - }); - 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); - }); + binding.modules.setOnClickListener(new StartActivityListener(ModulesActivity.class, true)); + binding.logs.setOnClickListener(new StartActivityListener(LogsActivity.class, true)); + binding.settings.setOnClickListener(new StartActivityListener(SettingsActivity.class, false)); + binding.about.setOnClickListener(new StartActivityListener(AboutActivity.class, false)); Glide.with(binding.appIcon) .load(GlideHelper.wrapApplicationInfoForIconLoader(getApplicationInfo())) .into(binding.appIcon); @@ -78,6 +64,28 @@ public class MainActivity extends BaseActivity { binding.statusSummary.setText(R.string.InstallDetail); binding.status.setCardBackgroundColor(ContextCompat.getColor(this, R.color.colorInstall)); 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); + } } } diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/ModulesActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/ModulesActivity.java index fe9cfb22..b6601929 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/ModulesActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/ModulesActivity.java @@ -3,9 +3,16 @@ package io.github.lsposed.manager.ui.activity; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.graphics.Typeface; import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.text.Spannable; +import android.text.SpannableStringBuilder; 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.Menu; import android.view.MenuItem; @@ -18,6 +25,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.SearchView; +import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.DividerItemDecoration; 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 { ActivityAppListBinding binding; - private int installedXposedVersion; private ApplicationFilter filter; private SearchView searchView; private SearchView.OnQueryTextListener mSearchListener; @@ -105,14 +112,6 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi filter = new ApplicationFilter(); moduleUtil = ModuleUtil.getInstance(); 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.setHasStableIds(true); moduleUtil.addListener(this); @@ -269,33 +268,38 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi .load(item.getPackageInfo()) .into(holder.appIcon); - TextView descriptionText = holder.appDescription; - descriptionText.setVisibility(View.VISIBLE); + SpannableStringBuilder sb = new SpannableStringBuilder(); if (!item.getDescription().isEmpty()) { - descriptionText.setText(item.getDescription()); + sb.append(item.getDescription()); } 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) { - warningText.setText(getString(R.string.no_min_version_specified)); - warningText.setVisibility(View.VISIBLE); + warningText = getString(R.string.no_min_version_specified); } else if (installedXposedVersion > 0 && item.minVersion > installedXposedVersion) { - warningText.setText(String.format(getString(R.string.warning_xposed_min_version), item.minVersion)); - warningText.setVisibility(View.VISIBLE); + warningText = String.format(getString(R.string.warning_xposed_min_version), item.minVersion); } 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.setVisibility(View.VISIBLE); + warningText = String.format(getString(R.string.warning_min_version_too_low), item.minVersion, ModuleUtil.MIN_MODULE_VERSION); } else if (item.isInstalledOnExternalStorage()) { - warningText.setText(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); + warningText = getString(R.string.warning_installed_on_external_storage); } + 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 items) { diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/SettingsActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/SettingsActivity.java index 84e5f369..3bac4aeb 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/SettingsActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/SettingsActivity.java @@ -22,6 +22,7 @@ import androidx.preference.Preference; import androidx.preference.SwitchPreferenceCompat; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.snackbar.Snackbar; import com.takisoft.preferencex.PreferenceFragmentCompat; import com.takisoft.preferencex.SimpleMenuPreference; @@ -80,6 +81,9 @@ public class SettingsActivity extends BaseActivity { return insets; }); } + if (Constants.getXposedVersion() == null) { + Snackbar.make(binding.snackbar, R.string.lsposed_not_active, Snackbar.LENGTH_LONG).show(); + } } private void restart() { @@ -127,20 +131,24 @@ public class SettingsActivity extends BaseActivity { public void onCreatePreferencesFix(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.prefs); + boolean installed = Constants.getXposedVersion() != null; SwitchPreferenceCompat prefVerboseLogs = findPreference("disable_verbose_log"); if (prefVerboseLogs != null) { + prefVerboseLogs.setEnabled(installed); prefVerboseLogs.setChecked(Files.exists(disableVerboseLogsFlag)); prefVerboseLogs.setOnPreferenceChangeListener(new OnFlagChangeListener(disableVerboseLogsFlag)); } SwitchPreferenceCompat prefModulesLogs = findPreference("disable_modules_log"); if (prefModulesLogs != null) { + prefModulesLogs.setEnabled(installed); prefModulesLogs.setChecked(Files.exists(disableModulesLogsFlag)); prefModulesLogs.setOnPreferenceChangeListener(new OnFlagChangeListener(disableModulesLogsFlag)); } SwitchPreferenceCompat prefEnableResources = findPreference("enable_resources"); if (prefEnableResources != null) { + prefEnableResources.setEnabled(installed); prefEnableResources.setChecked(Files.exists(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) { prefVariant.setVisible(false); } else { + prefVariant.setEnabled(installed); try { prefVariant.setValue(new String(Files.readAllBytes(variantFlag)).trim()); } catch (Exception e) { diff --git a/app/src/main/java/io/github/lsposed/manager/util/ModuleUtil.java b/app/src/main/java/io/github/lsposed/manager/util/ModuleUtil.java index f94c6389..2d6f06e0 100644 --- a/app/src/main/java/io/github/lsposed/manager/util/ModuleUtil.java +++ b/app/src/main/java/io/github/lsposed/manager/util/ModuleUtil.java @@ -1,6 +1,5 @@ package io.github.lsposed.manager.util; -import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @@ -33,12 +32,10 @@ public final class ModuleUtil { private Map installedModules; private final List enabledModules; private boolean isReloading = false; - private final SharedPreferences prefs; private ModuleUtil() { pm = App.getInstance().getPackageManager(); enabledModules = AppHelper.getEnabledModuleList(); - prefs = App.getPreferences(); } public static synchronized ModuleUtil getInstance() { @@ -226,18 +223,13 @@ public final class ModuleUtil { this.minVersion = 0; this.description = ""; } else { - int version = Constants.getXposedApiVersion(); - if (version > 0 && prefs.getBoolean("skip_xposedminversion_check", false)) { - this.minVersion = version; + Object minVersionRaw = app.metaData.get("xposedminversion"); + if (minVersionRaw instanceof Integer) { + this.minVersion = (Integer) minVersionRaw; + } else if (minVersionRaw instanceof String) { + this.minVersion = extractIntPart((String) minVersionRaw); } else { - Object minVersionRaw = app.metaData.get("xposedminversion"); - if (minVersionRaw instanceof Integer) { - this.minVersion = (Integer) minVersionRaw; - } else if (minVersionRaw instanceof String) { - this.minVersion = extractIntPart((String) minVersionRaw); - } else { - this.minVersion = 0; - } + this.minVersion = 0; } } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d55f2399..da28c627 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -74,7 +74,6 @@ android:layout_width="28dp" android:layout_height="28dp" android:layout_centerVertical="true" - android:contentDescription="@string/Activated" app:srcCompat="@drawable/ic_check_circle" app:tint="@android:color/white" /> @@ -84,7 +83,6 @@ android:layout_height="wrap_content" android:layout_marginStart="25dp" android:layout_toEndOf="@id/status_icon" - android:text="@string/Activated" android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:textColor="@android:color/white" /> @@ -95,7 +93,6 @@ android:layout_below="@id/status_title" android:layout_alignStart="@id/status_title" android:layout_marginTop="5dp" - android:text="@string/ActivatedDetail" android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textColor="@android:color/white" /> diff --git a/app/src/main/res/layout/item_module.xml b/app/src/main/res/layout/item_module.xml index b142bdab..4e24280a 100644 --- a/app/src/main/res/layout/item_module.xml +++ b/app/src/main/res/layout/item_module.xml @@ -85,18 +85,5 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_app_list.xml b/app/src/main/res/menu/menu_app_list.xml index fcd05f8b..8f4aaba3 100644 --- a/app/src/main/res/menu/menu_app_list.xml +++ b/app/src/main/res/menu/menu_app_list.xml @@ -4,7 +4,6 @@ diff --git a/app/src/main/res/menu/menu_modules.xml b/app/src/main/res/menu/menu_modules.xml index 67714a43..0daa984c 100644 --- a/app/src/main/res/menu/menu_modules.xml +++ b/app/src/main/res/menu/menu_modules.xml @@ -4,7 +4,6 @@ \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5c143f8a..b8094656 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -3,7 +3,6 @@ 已激活 安装 点按安装 LSPosed - LSPosed 框架已激活 模块 %d 模块已启用 日志 @@ -22,7 +21,6 @@ 模块日志 - 您确定? 请小心! 不再提示 @@ -42,12 +40,10 @@ 卸载 - 搜索 重新加载 框架 - 应用 主题 亮色 暗色 @@ -73,13 +69,10 @@ 此模块因被安装在 SD 卡中而导致无法加载, 请将其移动到内部存储 信息 - LSPosed 框架未安装 滚动到顶部 正在加载… 滚动到底部 - 关闭状态检查 - 关闭针对模块的\“LSPosed 安装状态\”检查 此处仅显示 LSPosed 及模块相关日志信息\n如果您想抓取系统日志, 可以尝试我们的 Log Catcher Magisk 模块 @@ -95,9 +88,7 @@ 禁用模块日志 模块抛出的的异常堆栈仍将正常抓取 跟随系统 - 使用纯黑深色主题 - ]]> - LSPosed 框架未安装或未激活, 您可在设置中关闭状态检查 + 使用纯黑深色主题 透明状态栏 应用名称 应用名称(降序) @@ -135,4 +126,5 @@ <b>警告:<\/b>SELinux 未处于严格模式!对此进行攻击的恶意程序可以完全控制你的设备,并可能造成你的财产损失和法律责任。 SELinux 未处于严格模式! LSPosed Manager 和 LSPosed Core 的版本不一致。请重新安装对应的版本。 + LSPosed 未安装或未激活 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index f4c6abec..c354e1c4 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -3,7 +3,6 @@ 已激活 安裝 點按安裝 LSPosed - LSPosed 框架已激活 模塊 %d 模塊已啟用 日誌 @@ -21,7 +20,6 @@ 模塊日誌 - 您確定? 請小心! 不再提示 @@ -41,12 +39,10 @@ 卸載 - 搜索 重新加載 框架 - 應用 主題 亮色 暗色 @@ -71,13 +67,10 @@ 此模塊因被安裝在 SD 卡中而導致無法加載, 請將其移動到內部存儲 信息 - LSPosed 框架未安裝 滾動到頂部 正在加載… 滾動到底部 - 關閉狀態檢查 - 關閉針對模塊的\"LSPosed 安裝狀態\"檢查 此處僅顯示 LSPosed 及模塊相關日誌信息\n如果您想抓取系統日誌, 可以嘗試我們的 Log Catcher Magisk 模塊 @@ -93,8 +86,8 @@ 模塊拋出的的異常堆棧仍將正常抓取 跟隨系統 使用純黑深色主題 + ]]> - LSPosed 框架未安裝或未激活, 您可在設置中關閉狀態檢查 透明狀態欄 應用名稱 應用名稱(降序) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index fdbcfcdd..8d1a6eef 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -3,7 +3,6 @@ 已啟用 安裝 點按安裝 LSPosed - LSPosed 框架已啟用 模組 %d 模組已啟用 日誌 @@ -22,7 +21,6 @@ 模組日誌 - 您確定? 請小心! 不再提示 @@ -42,12 +40,10 @@ 解除安裝 - 搜尋 重新載入 框架 - 程式 主題 亮色 暗色 @@ -73,13 +69,10 @@ 此模組因被安裝在 SD 卡中而導致無法載入, 請將其移動到內部儲存 資訊 - LSPosed 框架未安裝 滾動到頂部 正在載入… 滾動到底部 - 關閉狀態檢查 - 關閉針對模組的\"LSPosed 安裝狀態\"檢查 此處僅顯示 LSPosed 及模組相關日誌資訊\n如果您想抓取系統日誌, 可以嘗試我們的 Log Catcher Magisk 模組 @@ -96,8 +89,8 @@ 模組丟擲的的異常堆疊仍將正常抓取 跟隨系統 使用純黑深色主題 + ]]> - LSPosed 框架未安裝或未啟用, 您可在設定中關閉狀態檢查 透明狀態列 程式名稱 程式名稱(降序) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d17f898a..9000c783 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,7 +3,6 @@ Activated Install Tap to install LSPosed - LSPosed is activated Modules %d modules enabled Logs @@ -23,7 +22,6 @@ Modules Logs - Are you sure? Be careful! Don\'t show this again @@ -43,14 +41,12 @@ Uninstall - Search Reload Framework Enable resource hooks WARNING: Resource hooks are deprecated - Application Theme Light Dark @@ -76,13 +72,10 @@ This module cannot be loaded because it\'s installed on the SD card, please move it to internal storage Info - LSPosed Framework is not installed Scroll to top Loading… Scroll to bottom - Skip status check - Skip \"LSPosed Status\" check for modules Android %2$s (%1$s, API %3$d) This is the LSPosed Framework and modules log\nif you need a Android logcat, you can try our Log Catcher Magisk module @@ -106,7 +99,6 @@ Exception stack thrown by the module will still be catched normally Use the pure black dark theme Follow system - LSPosed Framework is not currently installed or active\nYou can close status check in settings Transparent status bar Sort by application name Sort by application name (reverse) @@ -142,4 +134,5 @@ <b>WARNING:<\/b> SELinux is not enforcing! the malicious program that attacks this can completely control your device and may cause your property damage and legal liability. SELinux is not enforcing! Version of LSPosed Manager and LSPosed Core are not consistent. Please re-install the corresponding version. + LSPosed is not currently installed or active. diff --git a/app/src/main/res/xml/prefs.xml b/app/src/main/res/xml/prefs.xml index e728cc42..3c97fcde 100644 --- a/app/src/main/res/xml/prefs.xml +++ b/app/src/main/res/xml/prefs.xml @@ -1,17 +1,6 @@ - - - -