From 7e344e2c7132b12924e8e35f2a2c854f8611da62 Mon Sep 17 00:00:00 2001 From: Nullptr Date: Sun, 15 Jan 2023 13:40:24 +0800 Subject: [PATCH] Store callback instances --- .../libxposed/service/XposedService.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/service/src/main/java/io/github/libxposed/service/XposedService.java b/service/src/main/java/io/github/libxposed/service/XposedService.java index e78bce9..e4c7e19 100644 --- a/service/src/main/java/io/github/libxposed/service/XposedService.java +++ b/service/src/main/java/io/github/libxposed/service/XposedService.java @@ -14,6 +14,7 @@ import java.io.FileOutputStream; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.WeakHashMap; import java.util.concurrent.locks.ReentrantReadWriteLock; @SuppressWarnings("unused") @@ -25,10 +26,12 @@ public final class XposedService { } } + private final static Map scopeCallbacks = new WeakHashMap<>(); + /** * Callback interface for module scope request */ - public interface IScopeCallback { + public interface OnScopeEventListener { /** * Callback when the request notification / window prompted * @@ -71,32 +74,32 @@ public final class XposedService { } private IXposedScopeCallback asInterface() { - return new IXposedScopeCallback.Stub() { + return scopeCallbacks.computeIfAbsent(this, (listener) -> new IXposedScopeCallback.Stub() { @Override public void onScopeRequestPrompted(String packageName) { - IScopeCallback.this.onScopeRequestPrompted(packageName); + listener.onScopeRequestPrompted(packageName); } @Override public void onScopeRequestApproved(String packageName) { - IScopeCallback.this.onScopeRequestApproved(packageName); + listener.onScopeRequestApproved(packageName); } @Override public void onScopeRequestDenied(String packageName) { - IScopeCallback.this.onScopeRequestDenied(packageName); + listener.onScopeRequestDenied(packageName); } @Override public void onScopeRequestTimeout(String packageName) { - IScopeCallback.this.onScopeRequestTimeout(packageName); + listener.onScopeRequestTimeout(packageName); } @Override public void onScopeRequestFailed(String packageName, String message) { - IScopeCallback.this.onScopeRequestFailed(packageName, message); + listener.onScopeRequestFailed(packageName, message); } - }; + }); } } @@ -257,7 +260,7 @@ public final class XposedService { * @param callback Callback to be invoked when the request is completed or error occurred * @throws ServiceException If the service is dead or error occurred */ - public void requestScope(@NonNull String packageName, @NonNull IScopeCallback callback) { + public void requestScope(@NonNull String packageName, @NonNull OnScopeEventListener callback) { try { mService.requestScope(packageName, callback.asInterface()); } catch (RemoteException e) {