Skip to content

Commit

Permalink
Merge 6f6c4b6
Browse files Browse the repository at this point in the history
  • Loading branch information
naicfeng committed Jul 3, 2023
2 parents 1b48c1a + 6f6c4b6 commit fc44a32
Show file tree
Hide file tree
Showing 13 changed files with 114 additions and 74 deletions.
15 changes: 15 additions & 0 deletions app/src/main/java/org/lsposed/manager/adapters/AppHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Parcel;
import android.view.MenuItem;

import org.lsposed.manager.ConfigManager;
Expand Down Expand Up @@ -140,6 +141,20 @@ public static Comparator<PackageInfo> getAppListComparator(int sort, PackageMana
synchronized public static List<PackageInfo> getAppList(boolean force) {
if (appList == null || force) {
appList = ConfigManager.getInstalledPackagesFromAllUsers(PackageManager.GET_META_DATA | PackageManager.MATCH_UNINSTALLED_PACKAGES, true);
PackageInfo system = null;
for (var app : appList) {
if ("android".equals(app.packageName)) {
var p = Parcel.obtain();
app.writeToParcel(p, 0);
p.setDataPosition(0);
system = PackageInfo.CREATOR.createFromParcel(p);
system.packageName = "system";
break;
}
}
if (system != null) {
appList.add(system);
}
}
return appList;
}
Expand Down
37 changes: 18 additions & 19 deletions app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@
import rikka.widget.mainswitchbar.MainSwitchBar;
import rikka.widget.mainswitchbar.OnMainSwitchChangeListener;

@SuppressLint("NotifyDataSetChanged")
public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter<ScopeAdapter.ViewHolder> implements Filterable {

private final Activity activity;
Expand Down Expand Up @@ -165,7 +164,7 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
}

private boolean shouldHideApp(PackageInfo info, ApplicationWithEquals app, HashSet<ApplicationWithEquals> tmpChkList) {
if (info.packageName.equals("android")) {
if (info.packageName.equals("system")) {
return false;
}
if (tmpChkList.contains(app)) {
Expand All @@ -190,18 +189,15 @@ private boolean shouldHideApp(PackageInfo info, ApplicationWithEquals app, HashS
return true;
}
}
if ((info.applicationInfo.flags & ApplicationInfo.FLAG_HAS_CODE) == 0) {
return true;
}
return preferences.getBoolean("filter_system_apps", true) && (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}

private int sortApps(AppInfo x, AppInfo y) {
Comparator<PackageInfo> comparator = AppHelper.getAppListComparator(preferences.getInt("list_sort", 0), pm);
Comparator<AppInfo> frameworkComparator = (a, b) -> {
if (a.packageName.equals("android") == b.packageName.equals("android")) {
if (a.packageName.equals("system") == b.packageName.equals("system")) {
return comparator.compare(a.packageInfo, b.packageInfo);
} else if (a.packageName.equals("android")) {
} else if (a.packageName.equals("system")) {
return -1;
} else {
return 1;
Expand Down Expand Up @@ -303,7 +299,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
return true;
}

@SuppressLint("WrongConstant")
public boolean onContextItemSelected(@NonNull MenuItem item) {
ApplicationInfo info = selectedInfo;
if (info == null) {
Expand All @@ -325,7 +320,7 @@ public boolean onContextItemSelected(@NonNull MenuItem item) {
} else if (itemId == R.id.menu_app_info) {
ConfigManager.startActivityAsUserWithFeature(new Intent(ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", info.packageName, null)), module.userId);
} else if (itemId == R.id.menu_force_stop) {
if (info.packageName.equals("android")) {
if (info.packageName.equals("system")) {
ConfigManager.reboot();
} else {
new BlurBehindDialogBuilder(activity, R.style.ThemeOverlay_MaterialAlertDialog_Centered_FullWidthButtons)
Expand Down Expand Up @@ -395,10 +390,10 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
AppInfo appInfo = showList.get(position);
boolean deny = denyList.contains(appInfo.packageName);
holder.root.setAlpha(!deny && enabled ? 1.0f : .5f);
boolean android = appInfo.packageName.equals("android");
boolean system = appInfo.packageName.equals("system");
CharSequence appName;
int userId = appInfo.applicationInfo.uid / App.PER_USER_RANGE;
appName = android ? activity.getString(R.string.android_framework) : appInfo.label;
appName = system ? activity.getString(R.string.android_framework) : appInfo.label;
holder.appName.setText(appName);
GlideApp.with(holder.appIcon).load(appInfo.packageInfo).into(new CustomTarget<Drawable>() {
@Override
Expand All @@ -416,16 +411,18 @@ public void onLoadFailed(@Nullable Drawable errorDrawable) {
holder.appIcon.setImageDrawable(pm.getDefaultActivityIcon());
}
});
SpannableStringBuilder sb = new SpannableStringBuilder();
if (android) {
holder.appPackageName.setVisibility(View.GONE);
if (system) {
//noinspection SetTextI18n
holder.appPackageName.setText("system");
holder.appVersionName.setVisibility(View.GONE);
} else {
holder.appPackageName.setVisibility(View.VISIBLE);
holder.appVersionName.setVisibility(View.VISIBLE);
holder.appPackageName.setText(appInfo.packageName);
holder.appVersionName.setText(activity.getString(R.string.app_version, appInfo.packageInfo.versionName));

}
holder.appPackageName.setVisibility(View.VISIBLE);
holder.appVersionName.setText(activity.getString(R.string.app_version, appInfo.packageInfo.versionName));
var sb = new SpannableStringBuilder();
if (!recommendedList.isEmpty() && recommendedList.contains(appInfo.application)) {
String recommended = activity.getString(R.string.requested_by_module);
sb.append(recommended);
Expand Down Expand Up @@ -467,9 +464,11 @@ public void onLoadFailed(@Nullable Drawable errorDrawable) {
if (launchIntent == null) {
menu.removeItem(R.id.menu_launch);
}
if (android) {
if (system) {
menu.findItem(R.id.menu_force_stop).setTitle(R.string.reboot);
menu.removeItem(R.id.menu_compile_speed);
menu.removeItem(R.id.menu_other_app);
menu.removeItem(R.id.menu_app_info);
}
});

Expand Down Expand Up @@ -522,7 +521,7 @@ public void refresh(boolean force) {
appList.parallelStream().forEach(info -> {
int userId = info.applicationInfo.uid / App.PER_USER_RANGE;
String packageName = info.packageName;
if (packageName.equals("android") && userId != 0 ||
if (packageName.equals("system") && userId != 0 ||
packageName.equals(module.packageName) ||
packageName.equals(BuildConfig.APPLICATION_ID)) {
return;
Expand Down Expand Up @@ -587,7 +586,7 @@ protected void onCheckedChange(CompoundButton buttonView, boolean isChecked, App
tmpChkList.remove(appInfo.application);
}
buttonView.setChecked(!isChecked);
} else if (appInfo.packageName.equals("android")) {
} else if (appInfo.packageName.equals("system")) {
fragment.showHint(R.string.reboot_required, true, R.string.reboot, v -> ConfigManager.reboot());
} else if (denyList.contains(appInfo.packageName)) {
fragment.showHint(activity.getString(R.string.deny_list, appInfo.label), true);
Expand Down
47 changes: 31 additions & 16 deletions app/src/main/java/org/lsposed/manager/util/ModuleUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
Expand Down Expand Up @@ -257,9 +258,9 @@ public class InstalledModule {
public final long updateTime;
public final ApplicationInfo app;
public final PackageInfo pkg;
private String appName; // loaded lazyily
private String description; // loaded lazyily
private List<String> scopeList; // loaded lazyily
private String appName; // loaded lazily
private String description; // loaded lazily
private List<String> scopeList; // loaded lazily

private InstalledModule(PackageInfo pkg, ZipFile modernModuleApk) {
app = pkg.applicationInfo;
Expand Down Expand Up @@ -305,6 +306,8 @@ private InstalledModule(PackageInfo pkg, ZipFile modernModuleApk) {
try (var reader = new BufferedReader(new InputStreamReader(modernModuleApk.getInputStream(scopeEntry)))) {
scopeList = reader.lines().collect(Collectors.toList());
}
} else {
scopeList = Collections.emptyList();
}
} catch (IOException | OutOfMemoryError e) {
Log.e(App.TAG, "Error while closing modern module APK", e);
Expand Down Expand Up @@ -350,25 +353,37 @@ public String getDescription() {

public List<String> getScopeList() {
if (scopeList != null) return scopeList;
if (legacy) {
try {
int scopeListResourceId = app.metaData.getInt("xposedscope");
if (scopeListResourceId != 0) {
scopeList = Arrays.asList(pm.getResourcesForApplication(app).getStringArray(scopeListResourceId));
} else {
String scopeListString = app.metaData.getString("xposedscope");
if (scopeListString != null)
scopeList = Arrays.asList(scopeListString.split(";"));
}
} catch (Exception ignored) {
List<String> list = null;
try {
int scopeListResourceId = app.metaData.getInt("xposedscope");
if (scopeListResourceId != 0) {
scopeList = Arrays.asList(pm.getResourcesForApplication(app).getStringArray(scopeListResourceId));
} else {
String scopeListString = app.metaData.getString("xposedscope");
if (scopeListString != null)
list = Arrays.asList(scopeListString.split(";"));
}
} catch (Exception ignored) {
}
if (scopeList == null) {
if (list == null) {
OnlineModule module = RepoLoader.getInstance().getOnlineModule(packageName);
if (module != null && module.getScope() != null) {
scopeList = module.getScope();
list = module.getScope();
}
}
if (list != null) {
list.replaceAll(s ->
switch (s) {
case "android":
yield "system";
case "system":
yield "android";
default:
yield s;
}
);
scopeList = list;
}
return scopeList;
}

Expand Down
6 changes: 3 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,11 @@ val verCode by extra(commitCount)
val verName by extra(latestTag)
val androidTargetSdkVersion by extra(33)
val androidMinSdkVersion by extra(27)
val androidBuildToolsVersion by extra("33.0.1")
val androidBuildToolsVersion by extra("33.0.2")
val androidCompileSdkVersion by extra(33)
val androidCompileNdkVersion by extra("25.2.9519653")
val androidSourceCompatibility by extra(JavaVersion.VERSION_11)
val androidTargetCompatibility by extra(JavaVersion.VERSION_11)
val androidSourceCompatibility by extra(JavaVersion.VERSION_17)
val androidTargetCompatibility by extra(JavaVersion.VERSION_17)

tasks.register("Delete", Delete::class) {
delete(rootProject.buildDir)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,12 @@

package org.lsposed.lspd.hooker;

import android.app.ActivityThread;
import android.app.LoadedApk;
import android.content.res.XResources;
import android.util.Log;

import org.lsposed.lspd.util.Hookers;

import java.util.Optional;

import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.XposedInit;
Expand Down Expand Up @@ -59,12 +56,6 @@ protected void afterHookedMethod(MethodHookParam<?> param) {
}
}

// mIncludeCode checking should go ahead of loadedPackagesInProcess added checking
if (!XposedHelpers.getBooleanField(loadedApk, "mIncludeCode")) {
Hookers.logD("LoadedApk#<init> mIncludeCode == false: " + mAppDir);
return;
}

if (!XposedInit.loadedPackagesInProcess.add(packageName)) {
Hookers.logD("LoadedApk#<init> has been loaded before, skip: " + mAppDir);
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@

import android.annotation.SuppressLint;
import android.app.ActivityThread;
import android.app.AndroidAppHelper;
import android.app.LoadedApk;
import android.content.pm.ApplicationInfo;
import android.os.Build;
Expand Down Expand Up @@ -90,7 +89,7 @@ protected void afterHookedMethod(MethodHookParam<?> param) {
boolean isFirstPackage = packageName != null && processName != null && packageName.equals(loadedApk.getPackageName());
if (!isFirstPackage) {
packageName = loadedApk.getPackageName();
processName = AndroidAppHelper.currentProcessName();
processName = ActivityThread.currentPackageName();
} else if (packageName.equals("android")) {
packageName = "system";
}
Expand Down
10 changes: 5 additions & 5 deletions core/src/main/java/org/lsposed/lspd/util/Hookers.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,18 @@

package org.lsposed.lspd.util;

import android.app.AndroidAppHelper;
import android.app.ActivityThread;

public class Hookers {

public static void logD(String prefix) {
Utils.logD(String.format("%s: pkg=%s, prc=%s", prefix, AndroidAppHelper.currentPackageName(),
AndroidAppHelper.currentProcessName()));
Utils.logD(String.format("%s: pkg=%s, prc=%s", prefix, ActivityThread.currentPackageName(),
ActivityThread.currentProcessName()));
}

public static void logE(String prefix, Throwable throwable) {
Utils.logE(String.format("%s: pkg=%s, prc=%s", prefix, AndroidAppHelper.currentPackageName(),
AndroidAppHelper.currentProcessName()), throwable);
Utils.logE(String.format("%s: pkg=%s, prc=%s", prefix, ActivityThread.currentPackageName(),
ActivityThread.currentProcessName()), throwable);
}

}
Loading

0 comments on commit fc44a32

Please sign in to comment.