Send broadcast to manager when updated module list

This commit is contained in:
tehcneko 2021-01-28 12:46:09 +08:00
parent f1461be83a
commit 54098c1dbc
3 changed files with 33 additions and 5 deletions

View File

@ -269,9 +269,13 @@ namespace edxp {
if (LIKELY(service_class)) { if (LIKELY(service_class)) {
jfieldID path_fid = JNI_GetStaticFieldID(env, service_class, "CONFIG_PATH", jfieldID path_fid = JNI_GetStaticFieldID(env, service_class, "CONFIG_PATH",
"Ljava/lang/String;"); "Ljava/lang/String;");
if (LIKELY(path_fid)) { jfieldID pn_fid = JNI_GetStaticFieldID(env, service_class, "INSTALLER_PACKAGE_NAME",
"Ljava/lang/String;");
if (LIKELY(path_fid) && LIKELY(pn_fid)) {
env->SetStaticObjectField(service_class, path_fid, env->NewStringUTF( env->SetStaticObjectField(service_class, path_fid, env->NewStringUTF(
ConfigManager::GetMiscPath().c_str())); ConfigManager::GetMiscPath().c_str()));
env->SetStaticObjectField(service_class, pn_fid, env->NewStringUTF(
ConfigManager::GetInstance()->GetInstallerPackageName().c_str()));
jmethodID install_mid = JNI_GetStaticMethodID(env, service_class, jmethodID install_mid = JNI_GetStaticMethodID(env, service_class,
"install", "()V"); "install", "()V");
if (LIKELY(install_mid)) { if (LIKELY(install_mid)) {

View File

@ -28,6 +28,8 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Scanner; import java.util.Scanner;
import de.robv.android.xposed.XposedHelpers;
import static com.elderdrivers.riru.edxp.service.ServiceProxy.CONFIG_PATH; import static com.elderdrivers.riru.edxp.service.ServiceProxy.CONFIG_PATH;
public class PackageReceiver { public class PackageReceiver {
@ -37,6 +39,8 @@ public class PackageReceiver {
private final String MODULES_LIST_FILENAME = "conf/modules.list"; private final String MODULES_LIST_FILENAME = "conf/modules.list";
private final String ENABLED_MODULES_LIST_FILENAME = "conf/enabled_modules.list"; private final String ENABLED_MODULES_LIST_FILENAME = "conf/enabled_modules.list";
private final String MODULE_UPDATED = "io.github.lsposed.action.MODULE_UPDATED";
private final String MODULE_NOT_ACTIVATAED = "io.github.lsposed.action.MODULE_NOT_ACTIVATAED";
private String getPackageName(Intent intent) { private String getPackageName(Intent intent) {
Uri uri = intent.getData(); Uri uri = intent.getData();
@ -137,6 +141,7 @@ public class PackageReceiver {
return true; return true;
} }
@SuppressLint("WrongConstant")
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (Objects.requireNonNull(intent.getAction()).equals(Intent.ACTION_PACKAGE_REMOVED) && intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) if (Objects.requireNonNull(intent.getAction()).equals(Intent.ACTION_PACKAGE_REMOVED) && intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))
@ -172,14 +177,32 @@ public class PackageReceiver {
@SuppressLint("DiscouragedPrivateApi") @SuppressLint("DiscouragedPrivateApi")
Method m = UserManager.class.getDeclaredMethod("getUsers"); Method m = UserManager.class.getDeclaredMethod("getUsers");
m.setAccessible(true); m.setAccessible(true);
boolean res = false;
for (Object uh : (List<Object>) m.invoke(um)) { for (Object uh : (List<Object>) m.invoke(um)) {
int uid = (int) uh.getClass().getDeclaredField("id").get(uh); int uid = (int) uh.getClass().getDeclaredField("id").get(uh);
Utils.logI("updating uid: " + uid); Utils.logI("updating uid: " + uid);
res = updateModuleList(uid, packageName) || res; boolean activated = updateModuleList(uid, packageName);
UserHandle userHandle = null;
try {
userHandle = (UserHandle) XposedHelpers.callStaticMethod(UserHandle.class, "of", uid);
} catch (Throwable t) {
Utils.logW("get user handle failed", t);
}
if (userHandle != null) {
try {
Intent broadCast = new Intent(activated ? MODULE_UPDATED : MODULE_NOT_ACTIVATAED);
broadCast.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES | 0x01000000);
broadCast.setData(intent.getData());
broadCast.setPackage(ServiceProxy.INSTALLER_PACKAGE_NAME);
XposedHelpers.callMethod(context, "sendBroadcastAsUser", broadCast, userHandle);
Utils.logI("broadcast to " + ServiceProxy.INSTALLER_PACKAGE_NAME);
} catch (Throwable t) {
Utils.logW("send broadcast failed", t);
Toast.makeText(context, "EdXposed: Updated " + packageName, Toast.LENGTH_SHORT).show();
}
} else if (activated) {
Toast.makeText(context, "EdXposed: Updated " + packageName, Toast.LENGTH_SHORT).show();
}
} }
if (res)
Toast.makeText(context, "EdXposed: Updated " + packageName, Toast.LENGTH_SHORT).show();
} catch (Throwable e) { } catch (Throwable e) {
Utils.logW("update failed", e); Utils.logW("update failed", e);
} }

View File

@ -17,6 +17,7 @@ import java.lang.reflect.Proxy;
public class ServiceProxy implements InvocationHandler, KeepAll { public class ServiceProxy implements InvocationHandler, KeepAll {
public static String CONFIG_PATH = null; public static String CONFIG_PATH = null;
public static String INSTALLER_PACKAGE_NAME = null;
private static IServiceManager original; private static IServiceManager original;