Store callback instances

This commit is contained in:
Nullptr 2023-01-15 13:40:24 +08:00
parent 6e4225960f
commit 7e344e2c71
No known key found for this signature in database
1 changed files with 12 additions and 9 deletions

View File

@ -14,6 +14,7 @@ import java.io.FileOutputStream;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
@SuppressWarnings("unused") @SuppressWarnings("unused")
@ -25,10 +26,12 @@ public final class XposedService {
} }
} }
private final static Map<OnScopeEventListener, IXposedScopeCallback> scopeCallbacks = new WeakHashMap<>();
/** /**
* Callback interface for module scope request * Callback interface for module scope request
*/ */
public interface IScopeCallback { public interface OnScopeEventListener {
/** /**
* Callback when the request notification / window prompted * Callback when the request notification / window prompted
* *
@ -71,32 +74,32 @@ public final class XposedService {
} }
private IXposedScopeCallback asInterface() { private IXposedScopeCallback asInterface() {
return new IXposedScopeCallback.Stub() { return scopeCallbacks.computeIfAbsent(this, (listener) -> new IXposedScopeCallback.Stub() {
@Override @Override
public void onScopeRequestPrompted(String packageName) { public void onScopeRequestPrompted(String packageName) {
IScopeCallback.this.onScopeRequestPrompted(packageName); listener.onScopeRequestPrompted(packageName);
} }
@Override @Override
public void onScopeRequestApproved(String packageName) { public void onScopeRequestApproved(String packageName) {
IScopeCallback.this.onScopeRequestApproved(packageName); listener.onScopeRequestApproved(packageName);
} }
@Override @Override
public void onScopeRequestDenied(String packageName) { public void onScopeRequestDenied(String packageName) {
IScopeCallback.this.onScopeRequestDenied(packageName); listener.onScopeRequestDenied(packageName);
} }
@Override @Override
public void onScopeRequestTimeout(String packageName) { public void onScopeRequestTimeout(String packageName) {
IScopeCallback.this.onScopeRequestTimeout(packageName); listener.onScopeRequestTimeout(packageName);
} }
@Override @Override
public void onScopeRequestFailed(String packageName, String message) { 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 * @param callback Callback to be invoked when the request is completed or error occurred
* @throws ServiceException If the service is dead 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 { try {
mService.requestScope(packageName, callback.asInterface()); mService.requestScope(packageName, callback.asInterface());
} catch (RemoteException e) { } catch (RemoteException e) {