Skip to content

Commit 714e6c8

Browse files
authored
Refactor framework daemon to Kotlin (#597)
We rewrite the Vector daemon from Java to Kotlin using a modular design as specified in the daemon README. This transition improves code maintainability and modernizes the codebase. We note below several behavior changes in this refactor. Bug Fixes and Improvements: - Directory Permissions: Correctly configured for XSharedPreference storage. - Database Management: Migrated to Android DatabaseHelper for better versioning and automatic migration from LSPosed database (`v101`). - CLI Tool: Added a command-line interface at `/data/adb/lspd/cli` for managing modules and scopes. Removed Features: - Denylist Filtering: Removed UI warnings for denylist apps, as the Vector functions independently of them. - In-app Updates: UI-based updates removed in favor of root-level manager updates (e.g., Magisk/KernelSU). - Logcat Watchdog: Removed due to lack of practical utility from previous debugging experiences. - Obfuscation Toggle: Xposed API obfuscation is now permanently enabled, while it remains configurable via `DaemonState` at compile-time.
1 parent 208796f commit 714e6c8

File tree

171 files changed

+5809
-7257
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

171 files changed

+5809
-7257
lines changed

app/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ plugins {
2424
alias(libs.plugins.nav.safeargs)
2525
alias(libs.plugins.autoresconfig)
2626
alias(libs.plugins.materialthemebuilder)
27-
alias(libs.plugins.lsplugin.resopt)
2827
alias(libs.plugins.lsplugin.apksign)
2928
}
3029

app/src/main/java/org/lsposed/manager/App.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ private static String readWebviewHTML(String name) {
9797
var list = AppHelper.getAppList(false);
9898
var pm = App.getInstance().getPackageManager();
9999
list.parallelStream().forEach(i -> AppHelper.getAppLabel(i, pm));
100-
AppHelper.getDenyList(false);
101100
ModuleUtil.getInstance();
102101
RepoLoader.getInstance();
103102
});

app/src/main/java/org/lsposed/manager/ConfigManager.java

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -178,25 +178,6 @@ public static boolean setVerboseLogEnabled(boolean enabled) {
178178
}
179179
}
180180

181-
public static boolean isLogWatchdogEnabled() {
182-
try {
183-
return LSPManagerServiceHolder.getService().isLogWatchdogEnabled();
184-
} catch (RemoteException e) {
185-
Log.e(App.TAG, Log.getStackTraceString(e));
186-
return false;
187-
}
188-
}
189-
190-
public static boolean setLogWatchdog(boolean enabled) {
191-
try {
192-
LSPManagerServiceHolder.getService().setLogWatchdog(enabled);
193-
return true;
194-
} catch (RemoteException e) {
195-
Log.e(App.TAG, Log.getStackTraceString(e));
196-
return false;
197-
}
198-
}
199-
200181
public static ParcelFileDescriptor getLog(boolean verbose) {
201182
try {
202183
return verbose ? LSPManagerServiceHolder.getService().getVerboseLog() : LSPManagerServiceHolder.getService().getModulesLog();
@@ -336,52 +317,6 @@ public static boolean setHiddenIcon(boolean hide) {
336317
}
337318
}
338319

339-
public static String getApi() {
340-
try {
341-
return LSPManagerServiceHolder.getService().getApi();
342-
} catch (RemoteException e) {
343-
Log.e(App.TAG, Log.getStackTraceString(e));
344-
return e.toString();
345-
}
346-
}
347-
348-
public static List<String> getDenyListPackages() {
349-
List<String> list = new ArrayList<>();
350-
try {
351-
list.addAll(LSPManagerServiceHolder.getService().getDenyListPackages());
352-
} catch (RemoteException e) {
353-
Log.e(App.TAG, Log.getStackTraceString(e));
354-
}
355-
return list;
356-
}
357-
358-
public static void flashZip(String zipPath, ParcelFileDescriptor outputStream) {
359-
try {
360-
LSPManagerServiceHolder.getService().flashZip(zipPath, outputStream);
361-
} catch (RemoteException e) {
362-
Log.e(App.TAG, Log.getStackTraceString(e));
363-
}
364-
}
365-
366-
public static boolean isDexObfuscateEnabled() {
367-
try {
368-
return LSPManagerServiceHolder.getService().getDexObfuscate();
369-
} catch (RemoteException e) {
370-
Log.e(App.TAG, Log.getStackTraceString(e));
371-
return false;
372-
}
373-
}
374-
375-
public static boolean setDexObfuscateEnabled(boolean enabled) {
376-
try {
377-
LSPManagerServiceHolder.getService().setDexObfuscate(enabled);
378-
return true;
379-
} catch (RemoteException e) {
380-
Log.e(App.TAG, Log.getStackTraceString(e));
381-
return false;
382-
}
383-
}
384-
385320
public static int getDex2OatWrapperCompatibility() {
386321
try {
387322
return LSPManagerServiceHolder.getService().getDex2OatWrapperCompatibility();

app/src/main/java/org/lsposed/manager/adapters/AppHelper.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,6 @@ synchronized public static List<PackageInfo> getAppList(boolean force) {
155155
return appList;
156156
}
157157

158-
synchronized public static List<String> getDenyList(boolean force) {
159-
if (denyList == null || force) {
160-
denyList = ConfigManager.getDenyListPackages();
161-
}
162-
return denyList;
163-
}
164-
165158
public static CharSequence getAppLabel(PackageInfo info, PackageManager pm) {
166159
if (info == null || info.applicationInfo == null) return null;
167160
return appLabel.computeIfAbsent(info, i -> i.applicationInfo.loadLabel(pm));

app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter<Scope
104104
private Set<ApplicationWithEquals> checkedList = new HashSet<>();
105105
private List<AppInfo> searchList = new ArrayList<>();
106106
private List<AppInfo> showList = new ArrayList<>();
107-
private List<String> denyList = new ArrayList<>();
108107

109108
public RecyclerView.Adapter<RecyclerView.ViewHolder> switchAdaptor = new RecyclerView.Adapter<>() {
110109
@NonNull
@@ -170,11 +169,6 @@ private boolean shouldHideApp(PackageInfo info, ApplicationWithEquals app, HashS
170169
if (tmpChkList.contains(app)) {
171170
return false;
172171
}
173-
if (preferences.getBoolean("filter_denylist", false)) {
174-
if (denyList.contains(info.packageName)) {
175-
return true;
176-
}
177-
}
178172
if (preferences.getBoolean("filter_modules", true)) {
179173
if (ModuleUtil.getInstance().getModule(info.packageName, info.applicationInfo.uid / App.PER_USER_RANGE) != null) {
180174
return true;
@@ -271,9 +265,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
271265
} else if (itemId == R.id.item_filter_modules) {
272266
item.setChecked(!item.isChecked());
273267
preferences.edit().putBoolean("filter_modules", item.isChecked()).apply();
274-
} else if (itemId == R.id.item_filter_denylist) {
275-
item.setChecked(!item.isChecked());
276-
preferences.edit().putBoolean("filter_denylist", item.isChecked()).apply();
277268
} else if (itemId == R.id.backup) {
278269
LocalDateTime now = LocalDateTime.now();
279270
try {
@@ -368,7 +359,6 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) {
368359
menu.findItem(R.id.item_filter_system).setChecked(preferences.getBoolean("filter_system_apps", true));
369360
menu.findItem(R.id.item_filter_games).setChecked(preferences.getBoolean("filter_games", true));
370361
menu.findItem(R.id.item_filter_modules).setChecked(preferences.getBoolean("filter_modules", true));
371-
menu.findItem(R.id.item_filter_denylist).setChecked(preferences.getBoolean("filter_denylist", false));
372362
switch (preferences.getInt("list_sort", 0)) {
373363
case 7 -> {
374364
menu.findItem(R.id.item_sort_by_update_time).setChecked(true);
@@ -405,8 +395,7 @@ public void onViewRecycled(@NonNull ViewHolder holder) {
405395
@Override
406396
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
407397
AppInfo appInfo = showList.get(position);
408-
boolean deny = denyList.contains(appInfo.packageName);
409-
holder.root.setAlpha(!deny && enabled ? 1.0f : .5f);
398+
holder.root.setAlpha(enabled ? 1.0f : .5f);
410399
boolean system = appInfo.packageName.equals("system");
411400
CharSequence appName;
412401
int userId = appInfo.applicationInfo.uid / App.PER_USER_RANGE;
@@ -452,20 +441,6 @@ public void onLoadFailed(@Nullable Drawable errorDrawable) {
452441
}
453442
sb.setSpan(foregroundColorSpan, sb.length() - recommended.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
454443
}
455-
if (deny) {
456-
if (sb.length() != 0) sb.append("\n");
457-
String denylist = activity.getString(R.string.deny_list_info);
458-
sb.append(denylist);
459-
final ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(ResourceUtils.resolveColor(activity.getTheme(), com.google.android.material.R.attr.colorError));
460-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
461-
final TypefaceSpan typefaceSpan = new TypefaceSpan(Typeface.create("sans-serif-medium", Typeface.NORMAL));
462-
sb.setSpan(typefaceSpan, sb.length() - denylist.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
463-
} else {
464-
final StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
465-
sb.setSpan(styleSpan, sb.length() - denylist.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
466-
}
467-
sb.setSpan(foregroundColorSpan, sb.length() - denylist.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
468-
}
469444
if (sb.length() == 0) {
470445
holder.hint.setVisibility(View.GONE);
471446
} else {
@@ -527,7 +502,6 @@ public void refresh(boolean force) {
527502
enabled = moduleUtil.isModuleEnabled(module.packageName);
528503
fragment.runAsync(() -> {
529504
List<PackageInfo> appList = AppHelper.getAppList(force);
530-
denyList = AppHelper.getDenyList(force);
531505
var tmpRecList = new HashSet<ApplicationWithEquals>();
532506
var tmpChkList = new HashSet<>(ConfigManager.getModuleScope(module.packageName));
533507
final var tmpList = new ArrayList<AppInfo>();
@@ -599,8 +573,6 @@ protected void onCheckedChange(CompoundButton buttonView, boolean isChecked, App
599573
buttonView.setChecked(!isChecked);
600574
} else if (appInfo.packageName.equals("system")) {
601575
fragment.showHint(R.string.reboot_required, true, R.string.reboot, v -> ConfigManager.reboot());
602-
} else if (denyList.contains(appInfo.packageName)) {
603-
fragment.showHint(activity.getString(R.string.deny_list, appInfo.label), true);
604576
}
605577
checkedList = tmpChkList;
606578
}

app/src/main/java/org/lsposed/manager/ui/dialog/FlashDialogBuilder.java

Lines changed: 0 additions & 141 deletions
This file was deleted.

0 commit comments

Comments
 (0)