Better impl of LSPosedRemotePreference

This commit is contained in:
LoveSy 2023-01-03 16:17:39 +08:00 committed by LoveSy
parent d9b3263077
commit cfe15100c0
1 changed files with 13 additions and 11 deletions

View File

@ -3,6 +3,7 @@ package org.lsposed.lspd.impl;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.ArraySet;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -28,21 +29,22 @@ public class LSPosedRemotePreferences implements SharedPreferences {
IRemotePreferenceCallback callback = new IRemotePreferenceCallback.Stub() { IRemotePreferenceCallback callback = new IRemotePreferenceCallback.Stub() {
@Override @Override
synchronized public void onUpdate(Bundle bundle) { synchronized public void onUpdate(Bundle bundle) {
if (bundle.containsKey("map")) Set<String> changes = new ArraySet<>();
mMap.putAll((Map<String, ?>) bundle.getSerializable("map"));
if (bundle.containsKey("delete")) { if (bundle.containsKey("delete")) {
for (var key : bundle.getStringArrayList("delete")) { var deletes = bundle.getStringArrayList("delete");
changes.addAll(deletes);
for (var key : deletes) {
mMap.remove(key); mMap.remove(key);
synchronized (mListeners) {
mListeners.forEach((listener, __) -> listener.onSharedPreferenceChanged(LSPosedRemotePreferences.this, key));
}
} }
} }
if (bundle.containsKey("diff")) { if (bundle.containsKey("put")) {
for (var key : bundle.getStringArrayList("diff")) { var puts = (Map<String, Object>) bundle.getSerializable("put");
synchronized (mListeners) { mMap.putAll(puts);
mListeners.forEach((listener, __) -> listener.onSharedPreferenceChanged(LSPosedRemotePreferences.this, key)); changes.addAll(puts.keySet());
} }
synchronized (mListeners) {
for (var key : changes) {
mListeners.keySet().forEach(listener -> listener.onSharedPreferenceChanged(LSPosedRemotePreferences.this, key));
} }
} }
} }