diff --git a/core/src/main/java/org/lsposed/lspd/impl/LSPosedRemotePreferences.java b/core/src/main/java/org/lsposed/lspd/impl/LSPosedRemotePreferences.java index 54876845..4e9c843e 100644 --- a/core/src/main/java/org/lsposed/lspd/impl/LSPosedRemotePreferences.java +++ b/core/src/main/java/org/lsposed/lspd/impl/LSPosedRemotePreferences.java @@ -3,6 +3,7 @@ package org.lsposed.lspd.impl; import android.content.SharedPreferences; import android.os.Bundle; import android.os.RemoteException; +import android.util.ArraySet; import androidx.annotation.Nullable; @@ -28,21 +29,22 @@ public class LSPosedRemotePreferences implements SharedPreferences { IRemotePreferenceCallback callback = new IRemotePreferenceCallback.Stub() { @Override synchronized public void onUpdate(Bundle bundle) { - if (bundle.containsKey("map")) - mMap.putAll((Map) bundle.getSerializable("map")); + Set changes = new ArraySet<>(); 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); - synchronized (mListeners) { - mListeners.forEach((listener, __) -> listener.onSharedPreferenceChanged(LSPosedRemotePreferences.this, key)); - } } } - if (bundle.containsKey("diff")) { - for (var key : bundle.getStringArrayList("diff")) { - synchronized (mListeners) { - mListeners.forEach((listener, __) -> listener.onSharedPreferenceChanged(LSPosedRemotePreferences.this, key)); - } + if (bundle.containsKey("put")) { + var puts = (Map) bundle.getSerializable("put"); + mMap.putAll(puts); + changes.addAll(puts.keySet()); + } + synchronized (mListeners) { + for (var key : changes) { + mListeners.keySet().forEach(listener -> listener.onSharedPreferenceChanged(LSPosedRemotePreferences.this, key)); } } }