Fix remote preferences listener not working on system_server (#2794)
This commit is contained in:
parent
7fef809d01
commit
dd66cf2b07
|
|
@ -10,10 +10,10 @@ import androidx.annotation.Nullable;
|
|||
import org.lsposed.lspd.service.ILSPInjectedModuleService;
|
||||
import org.lsposed.lspd.service.IRemotePreferenceCallback;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.WeakHashMap;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
|
@ -21,8 +21,7 @@ public class LSPosedRemotePreferences implements SharedPreferences {
|
|||
|
||||
private final Map<String, Object> mMap = new ConcurrentHashMap<>();
|
||||
|
||||
private static final Object CONTENT = new Object();
|
||||
final WeakHashMap<OnSharedPreferenceChangeListener, Object> mListeners = new WeakHashMap<>();
|
||||
final HashSet<OnSharedPreferenceChangeListener> mListeners = new HashSet<>();
|
||||
|
||||
IRemotePreferenceCallback callback = new IRemotePreferenceCallback.Stub() {
|
||||
@Override
|
||||
|
|
@ -42,7 +41,7 @@ public class LSPosedRemotePreferences implements SharedPreferences {
|
|||
}
|
||||
synchronized (mListeners) {
|
||||
for (var key : changes) {
|
||||
mListeners.keySet().forEach(listener -> listener.onSharedPreferenceChanged(LSPosedRemotePreferences.this, key));
|
||||
mListeners.forEach(listener -> listener.onSharedPreferenceChanged(LSPosedRemotePreferences.this, key));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -117,7 +116,7 @@ public class LSPosedRemotePreferences implements SharedPreferences {
|
|||
@Override
|
||||
public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
|
||||
synchronized (mListeners) {
|
||||
mListeners.put(listener, CONTENT);
|
||||
mListeners.add(listener);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -215,6 +215,11 @@ public class ConfigManager {
|
|||
var module = new Module();
|
||||
module.apkPath = cursor.getString(apkPathIdx);
|
||||
module.packageName = cursor.getString(pkgNameIdx);
|
||||
var cached = cachedModule.get(module.packageName);
|
||||
if (cached != null) {
|
||||
modules.add(cached);
|
||||
continue;
|
||||
}
|
||||
var statPath = toGlobalNamespace("/data/user_de/0/" + module.packageName).getAbsolutePath();
|
||||
try {
|
||||
module.appId = Os.stat(statPath).st_uid;
|
||||
|
|
@ -229,7 +234,7 @@ public class ConfigManager {
|
|||
} catch (PackageParser.PackageParserException e) {
|
||||
Log.w(TAG, "failed to parse " + module.apkPath, e);
|
||||
}
|
||||
module.service = new LSPInjectedModuleService(module);
|
||||
module.service = new LSPInjectedModuleService(module.packageName);
|
||||
modules.add(module);
|
||||
}
|
||||
}
|
||||
|
|
@ -548,7 +553,6 @@ public class ConfigManager {
|
|||
var module = new Module();
|
||||
module.packageName = packageName;
|
||||
module.apkPath = apkPath;
|
||||
module.service = new LSPInjectedModuleService(module);
|
||||
modules.add(module);
|
||||
}
|
||||
|
||||
|
|
@ -590,6 +594,7 @@ public class ConfigManager {
|
|||
}
|
||||
m.appId = pkgInfo.applicationInfo.uid;
|
||||
m.applicationInfo = pkgInfo.applicationInfo;
|
||||
m.service = oldModule != null ? oldModule.service : new LSPInjectedModuleService(m.packageName);
|
||||
return true;
|
||||
}).forEach(m -> {
|
||||
var file = ConfigFileManager.loadModule(m.apkPath, dexObfuscate);
|
||||
|
|
|
|||
|
|
@ -21,12 +21,12 @@ public class LSPInjectedModuleService extends ILSPInjectedModuleService.Stub {
|
|||
|
||||
private static final String TAG = "LSPosedInjectedModuleService";
|
||||
|
||||
private final Module loadedModule;
|
||||
private final String mPackageName;
|
||||
|
||||
Map<String, Set<IRemotePreferenceCallback>> callbacks = new ConcurrentHashMap<>();
|
||||
|
||||
LSPInjectedModuleService(Module module) {
|
||||
loadedModule = module;
|
||||
LSPInjectedModuleService(String packageName) {
|
||||
mPackageName = packageName;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -38,7 +38,7 @@ public class LSPInjectedModuleService extends ILSPInjectedModuleService.Stub {
|
|||
public Bundle requestRemotePreferences(String group, IRemotePreferenceCallback callback) {
|
||||
var bundle = new Bundle();
|
||||
var userId = Binder.getCallingUid() / PER_USER_RANGE;
|
||||
bundle.putSerializable("map", ConfigManager.getInstance().getModulePrefs(loadedModule.packageName, userId, group));
|
||||
bundle.putSerializable("map", ConfigManager.getInstance().getModulePrefs(mPackageName, userId, group));
|
||||
if (callback != null) {
|
||||
var groupCallbacks = callbacks.computeIfAbsent(group, k -> ConcurrentHashMap.newKeySet());
|
||||
groupCallbacks.add(callback);
|
||||
|
|
@ -56,7 +56,7 @@ public class LSPInjectedModuleService extends ILSPInjectedModuleService.Stub {
|
|||
ConfigFileManager.ensureModuleFilePath(path);
|
||||
var userId = Binder.getCallingUid() / PER_USER_RANGE;
|
||||
try {
|
||||
var dir = ConfigFileManager.resolveModuleDir(loadedModule.packageName, FILES_DIR, userId, -1);
|
||||
var dir = ConfigFileManager.resolveModuleDir(mPackageName, FILES_DIR, userId, -1);
|
||||
return ParcelFileDescriptor.open(dir.resolve(path).toFile(), ParcelFileDescriptor.MODE_READ_ONLY);
|
||||
} catch (Throwable e) {
|
||||
throw new RemoteException(e.getMessage());
|
||||
|
|
@ -67,7 +67,7 @@ public class LSPInjectedModuleService extends ILSPInjectedModuleService.Stub {
|
|||
public String[] getRemoteFileList() throws RemoteException {
|
||||
var userId = Binder.getCallingUid() / PER_USER_RANGE;
|
||||
try {
|
||||
var dir = ConfigFileManager.resolveModuleDir(loadedModule.packageName, FILES_DIR, userId, -1);
|
||||
var dir = ConfigFileManager.resolveModuleDir(mPackageName, FILES_DIR, userId, -1);
|
||||
var files = dir.toFile().list();
|
||||
return files == null ? new String[0] : files;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue